Gitまとめ

#ファイル保存領域
- ワーキングツリー
- インデックス（ステージ）
- ローカルリポジトリ

##ワーキングツリー
- 作業しているディレクトリ領域　実際のファイルやディレクトリのこと

##インデックス（ステージ）
- コミットを行う対象のファイルを選んで一時登録しておく領域

##ローカルリポジトリ
- ファイルのバージョン情報を管理する領域

# ブランチ
- コミットを指すポインタ（コミットIDを記録したポインタ）

# HEAD
- 現在作業しているブランチを指すポインタ
- HEAD~　や　HEAD^　は一つ前のコミットを指す
- HEAD~2 HEAD~3 という書き方で複数前のコミットを指すことができる

#基本コマンド

## status
- ファイル保存領域の状態を表示する

```
# 基本
git status

# 簡潔に表示する
git status -s

```  

## log
- コミット履歴を確認する 

```
# 一行で表示
git log --oneline

# 変更差分を表示する
git log -p <file>

# 表示するコミット数を限定する
git log -n コミット数

```

## add
- ワーキングツリーからインデックスに登録する（ステージング）

```
# ワーキングツリーで新規作成、変更されたファイルをステージング
git add .

# 指定したファイルをステージング
git add <file>

# ブランチ

```

## commit
- インデックスからローカルリポジトリに変更履歴を登録する

```
# エディタを起動せずにコミットする
git commit -m "コミットメッセージ"

# エディタにファイルの変更差分を表示してコミットする
git commit -v

# 直前のコミットを上書きする
# リモートリポジトリにPushされたコミットにはやらないこと
git commit --amend
```

## diff
- ファイル同士の差分を表示する
- オプションによって比較するファイルが変わる

```
# オプションなし　ワーキングツリーとインデックスの差分
# git add する前の差分確認に
git diff

# インデックスとHEADの差分
# git commit する前の差分確認に
git diff --cached

# ワーキングツリーとHEADの差分
# 前回コミットからどれくれい編集したかの差分確認に
git diff HEAD

```


## checkout
- ブランチを切り替える
- インデックスをもとにワーキングツリーのファイルを復元する

```
# 指定したブランチに切り替える　実際は、HEADの指す先が変わる
git checkout <branch>

# ブランチを新規作成して切り替える
git checkout -b <branch>

# 指定したファイルを復元する 実際は、ステージのインデックスにあるファイル情報を、ワーキングツリーのファイルに反映させる
git checkout -- <file>

```

## reset
- HEAD の位置を変更するコマンド
- オプションによってインデックス、ワーキングツリーの内容も変更できる
- --soft : HEAD位置のみを変更する インデックス、ワーキングツリーには影響なし
- --mixed : HEAD位置とインデックスを変更する ワーキングツリーには影響なし　（オプション指定なしの場合もmixed扱い）
- --hard : HEAD位置とインデックスとワーキングツリーを変更する

```
# HEAD位置を一つ前のコミットへ変更する
# ワーキングツリーの状態をそのままに、直前コミットを取り消したい場合に使用する
git reset --soft HEAD~

# HEAD位置とインデックスをHEADが指す状態に戻す
# addを取り消すコマンドとして使用する
git reset HEAD

# HEAD位置とインデックスとワーキングツリーをHEADが指すコミットに戻す
git reset --hard HEAD

```

## remote
- リモートリポジトリに関する操作

```
# リモート名と対応URLを表示
git remote -v

# 接続するリモートリポジトリを追加
git remote add <remote>　<url>

# リモートの詳細情報を表示
git remote show <remote>

# リモート名をリネームする
git remote rename <old-name> <new-name>

# リモートリポジトリ情報を削除する
git remote rm <remote>

```

## branch
- ブランチに関する操作

```
# ブランチを一覧表示する
git branch

# ブランチを新規作成する
# HEADは移動しない
git branch <branch>

# 作業中のブランチ名を変更する
git branch -m <new branch name>

# ブランチを削除する
# masterにマージされていないcommitがある場合削除されない
git branch -d <branch>

# ブランチを削除する
# 強制削除
git branch -D <branch>

```

## fetch
- リモートリポジトリから情報を取得する
- ワーキングツリーには影響がない　ワーキングツリーに情報を反映するには merge を使う

```
# リモートリポジトリ（orijin）から情報を取得する
git fetch orijin

# リモートリポジトリ、ブランチまで指定して取得できる
git fetch <remote> <branch>

```

## merge
- ブランチの変更内容を統合する

```
# 作業中のブランチに統合する
git merge <branch>


```

### fast forward
Aブランチから枝分かれしてBブランチを作成し、Bブランチでコミットを行い、Aブランチにチェックアウトしてマージをする
Aブランチに変更がない場合に行われるマージを fast forward マージと言う
Aブランチが指すコミットへのポインタが、Bブランチの最新コミットへと移動するだけ
つまり、AブランチのとBブランチの指す最新コミットが同じコミットを指している状態になる


### コンフリクト
AブランチとBブランチで同じファイル同じ行への修正を行いマージした時に起こる衝突
gitではどちらの修正を優先するかの判断ができない

#### コンフリクトを防ぐ運用ルール
- 複数人で同じファイルを変更しない
- pull や merge する前に変更中の状態をなくしておく（commitやstashをしておく）
- pullするときは、pullするブランチに移動してからpullする 

## pull
- リモートリポジトリから情報を取得し、マージする

```
# リモートリポジトリからブランチの履歴情報を取得する
# fetch + merge
git pull <remote> <branch>

# fetch + rebase
git pull --rebase <remote> <branch>

```

## rebase
- 履歴をキレイに整える形で変更を統合する
- コミットをやり直し、削除や順番の入れ替え

```
# 現在作業中のブランチを指定したブランチに統合する
git rebase <branch>

# 最新コミットから指定したコミットまでを構築し直す
# エディタが起動し、対話式リベースモードに入る
git rebase -i <commit>

# 対話式リベースモードでのコマンド
pick = コミットをそのまま採用（修正なし）
reword = コミットを採用するが、コミットメッセージを変更
edit = コミット採用するが、ファイルの修正をする
squash = 一個前のコミットと合体させる
fixup = コミットメッセージを変更しない点以外、squashと同じ
exec = shellでコマンドを実行する
drop = コミットを削除

また、コミットの記載順序を入れ替えることで
コミットの順番を本当に入れ替えることできる

```
### rebaseについての注意
リモートリポジトリにpushしたコミットをrebaseするのはNG

rebaseの図解で分かりやすかった資料
[Gitのマージを図解する](https://www.kaitoy.xyz/2015/12/28/git-merge/)

## tag
- タグに関する操作
- タグとは、コミットを参照しやすくるためにエイリアスをつけること
- タグには２種類あり、注釈付きのタグと、軽量版のタグがある

```
# 全てのタグを表示する
git tag

# パターンを指定してタグを検索表示する
git tag -l "検索文字列"

# 注釈付きタグを作成する
# 注釈付きタグは、タグ名、メッセージ、作成者の署名が付けられる
# エディタが起動しメッセージが入力できる
# コミットを指定しない場合、現在作業中ブランチの最新コミットにタグが付く
git tag -a <tag-name>　<commit>

# 軽量版タグを作成する
# 軽量版タグは、タグ名のみ付けられる
git tag <tag-name> <commit>

# タグの詳細を表示する場合は show を使う
git show <tag-name>

```

## stash
- ワーキングツリーとインデックスの作業内容を一時退避する

```
# ワーキングツリーとインデックスの内容をstash領域に保存する
# オプション save は省略可能
git stash save

# 保管状態の一覧で表示する
git stash list

# 指定した退避内容をワーキングツリーに復元する
# インデックスまでは復元されない
git stash apply stash@{0}

# ワーキングツリーとインデックスを復元する
git stash apply --index stash@{0}

# 指定した退避内容を削除する
# スタッシュを指定しない場合、最新の退避内容を削除する
git stash drop stash@{0}

# 全ての退避内容を削除する
git stash clear


```

#参考
[もう怖くないGit！チーム開発で必要なGitを完全マスター](https://www.udemy.com/unscared_git/)
[Git超絶まとめ](https://qiita.com/masashi127/items/2e103c3fba9d1b058961)
[git diff の使い方がほんの少し理解できた](http://d.hatena.ne.jp/murank/20110320/1300619118)
[私の使うGitコマンドまとめ 見る編](https://naokirin.hatenablog.com/entries/2011/12/02#git-show)
[git reset についてもまとめてみる](http://d.hatena.ne.jp/murank/20110327/1301224770)