Gitお勉強のまとめ

# 【単語】

|単語|説明|
|:---|:---|
|ワークツリー |作業環境(手元)|
|インデックス(ステージ)|コミット対象を置く場所|
|リポジトリ|変更履歴を記録する場所|
|HEAD|今自分が作業している場所を示すポインタ|

# 【よく使うコマンド】

|コマンド|説明|
|:---|:---|
|git init|初期化  ロカールリポジトリ作成|
|git add|インデックス(ステージ)への追加|
|git add .|全変更ファイルをステージへ反映|
|git commit|リポジトリへの反映|
|git commit -m "コミットメッセージ"|コミットメッセージと共にコミット|
|git reset ファイル|ステージへ追加されたファイルの取り消し|
|git diff|変更点を確認　リポジトリとワークツリーの差分チェック|
|git diff -stage|リポジトリとステージの差分|
|git diff 前のコミット番号 後のコミット番号|コミット番号間の差分|
|git status|変更ファイルをチェック。[ここ](https://qiita.com/tommy_aka_jps/items/af536a7c20747f99aa42)に色々載っています。|
|git log|履歴の確認|
|git checkout -b ブランチ名|ブランチの作成|
|git branch|現在のブランチを確認|
|git branch -m ブランチ名|ブランチ名を変更|
|git branch -d ブランチ名|ブランチを削除(派生元から派生後、派生元へマージしていない場合削除されない)|
|git branch -D ブランチ名|ブランチを削除(強制削除)|
|git checkout ブランチ名|ブランチの切り替え。※-bオプションでブランチ作成も同時に行う。|
|git switch ブランチ名|git checkout ブランチ名と同じ|
|git restore ファイル名|ワークツリーの変更を取り消す|
|git restore -staged ファイル名|ステージに挙げた変更をワークツリーに戻す|

# 【GitコマンドTips】

- ブランチを横断したGrep

```typescript
git grep '検索文字列' $(git list-remote . 'refs/remotes/*' | cut -f 2)
```

- コミット番号からブランチを検索

```typescript
git branch -r --contains SHA-1の頭
```

- コミット番号から日付を見る

```typescript
git show SHA-1の頭
```

# 【Git Flowについて】

https://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html

|ブランチ|説明|
|:---|:---|
|master|本番環境|
|hotfix|本番(master)のバグ修正。本番バングを早急にバグを修正するためのブランチ<br>バグ修正が終わったらmasterとdevelopへ反映|
|release|developから派生し本番(master)反映前にテストを行うブランチ。<br>テストがOKだったらmasterとdevelop両方へマージする|
|develop|masterと同じ状態を保つ。ステージング環境への反映用|
|feature|機能開発用。developから派生|

# 【Gitコマンド練習】

### 1.Local Repository作成

作業フォルダに移動し、Gitローカルリポジトリを作成

```typescript
git init
```

`.git`隠しフォルダが作成されていることを確認


```typescript
ls -a
```

### 2.ファイル作成、初回コミット

ファイルを作成します。

```typescript
touch index.html
```

以下のように編集しておきます。
（私は、ターミナルで完結できないかと慣れないviで編集してみました。）

```typescript
<p>1行目</p>
<p>2行目</p>
<p>3行目</p>
```

状態を確認

```typescript
git status
```

ワークツリーの編集内容をインデックス（ステージ）にします。

```typescript
git add .
```

状態を確認

```typescript
git status
```

初回コミット
※`Author identity unknown`のエラーが出た人はググって、設定を行ってください。(私は出ました。。。)

```typescript
git commit -m "初回コミット"
```

状態を確認

```typescript
git status
```

ログを確認してみる

```typescript
git log
```

状態を確認

```typescript
git status
```

### 3.ブランチ作成、ブランチでの編集とコミット

ブランチ作成（とブランチ切り替え）

```typescript
git checkout -b "ブランチ名"
```

作成したブランチにいることを確認する

```typescript
git branch
```

ファイルを編集する（4行目を追加する）

```typescript
<p>1行目</p>
<p>2行目</p>
<p>3行目</p>
<p>four行目</p>
```

状態を確認

```typescript
git status
```

インデックス（ステージ）に追加

```typescript
git add .
```

状態を確認

```typescript
git status
```

コミット

```typescript
git commit -m "four行目追加した"
```

状態を確認

```typescript
git status
```

ログを確認

```typescript
git log
```

### 4.masterでの編集とコミット

ブランチ切り替え

```typescript
git checkout "master"
```

masterブランチにいることを確認する

```typescript
git branch
```

ファイルを編集する（4,5行目を追加する）

```typescript
<p>1行目</p>
<p>2行目</p>
<p>3行目</p>
<p>4行目</p>
<p>5行目</p>
```

状態を確認

```typescript
git status
```

インデックス（ステージ）に追加

```typescript
git add .
```

状態を確認

```typescript
git status
```

コミット

```typescript
git commit -m "4,5行目追加した"
```

状態を確認

```typescript
git status
```

ログを確認

```typescript
git log
```

### 5.競合させてみる。競合を解決する。

git mergeでコンフリクトを発生させてみる
masterブランチにいることを確認し下記コマンドを実行します。

```typescript
$ git merge feature
```

以下のようなメッセージが表示されると思います。

```typescript
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
```

index.htmlの中身は以下のようになっているかと思います。
`=======`から上の`HEAD`部分がmasterでの変更内容、`=======`から下の`feature`の変更内容になります。

```typescript
<p>111</p>
<p>222</p>
<p>333</p>
<<<<<<< HEAD
<p>444</p>
=======
<p>four</p>
<p>five</p>
feature
```

以下のように修正します。

```typescript
<p>111</p>
<p>222</p>
<p>333</p>
<p>444</p>
<p>five</p>
```

コミットします。

```typescript
git add index.html
git commit -m "index.htmlのコンフリクト解消(master←featureへのマージ時)"
```

`git status`や`git log`で状況を確認してみてください。

### 6. stashを使ってみる