Gitチートシート

#Gitチートシート

##用語
###リポジトリ
バージョン管理システムにおいて，プログラムやファイルを蓄積しておく場所．
Gitではローカルリポジトリとリモートリポジトリの二種類のリポジトリを扱える．

###ローカルリポジトリ
現在作業中のリポジトリ．主に自分のPCや開発サーバーなどで作業する場合はローカルリポジトリとなる．
また，リモートリポジトリからリポジトリをクローンして，自分のPC上やサーバー上に環境を構築することもできる．

###リモートリポジトリ
外部にあるリポジトリ．リモートリポジトリはローカルリポジトリを通じて作業を行う．
複数人での作業やインターネットに公開する場合に利用できる．

###ワーキングツリー
ユーザーが編集したり新しいファイルを作成したりする場所．

###インデックス
ワーキングツリーでの編集後，リポジトリへのコミットの前に次のコミットの対象となる状態を保持している場所．

###ブランチ
履歴の流れを分岐して記録していくためのもの．分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができる。

Gitでは，**ローカルブランチ**，**リモートブランチ**,**リモートトラッキングブランチ**の3種類が存在する．

####ローカルブランチ
ローカルリポジトリ内で管理されるブランチ．

####リモートブランチ
リモートリポジトリにあるブランチ．

####リモートトラッキングブランチ
リモートブランチをローカルリポジトリえトラッキング(追跡)するためのブランチ．
例えば，**origin/master**は，origin という名前のリモートリポジトリにあるmasterブランチをトラッキングしていることを表す．

###チェックアウト
リポジトリにあるブランチを，ワーキングツリーに展開すること．
Gitでは，ブランチだけでなくタグや特定のコミット，リモートリポジトリのブランチなどもチェックアウトできる．

###タグ
コミットを参照しやすいようにつける名前．

###コミット
ファイルの変更に対してつけるメッセージ

###リビジョン
コミット毎に作成されるハッシュ値．
Gitではハッシュ値を使って世代管理を行っている．

###HEAD
現在チェックアウトしているブランチの最新コミットを指定する代名詞．

###FETCH_HEAD
最後に取得したリモートブランチの最新コミットを指定する代名詞．

###ORIG_HEAD
前のHEADの値を指定する代名詞．

###MERGE_HEAD
マージ中に生成され，ブランチにマージするコミットが記録されている代名詞．

##基本的ワークフロー
1. リポジトリの作成
2. ファイルの作成と編集(ワーキングツリー)
3. インデックスへの登録
4. リポジトリへのコミット

##初期設定
###リポジトリの作成
```
#リポジトリの作成
git init

ls a
.    ..   .git

#作成されたフォルダとファイル
cd .git
ls
HEAD        description info        refs
config      hooks       objects
```

###Gitで使う名前とアドレスの作成
```
#グローバル設定
git config --global user.name "username"
git config --global user.email "email"

#該当リポジトリ
git config user.name "username"
git config user.email "email"
```


##基本コマンド
###ファイルをインデックスに登録．
```
git add filename

#カレントディレクトリの指定
git add .

#全てのファイルを登録
git add --all
```

###変更をローカルリポジトリにコミット
インデックスに登録されているファイルの変更をリポジトリにコミットする．

```
#コミット
git commit -m 'message'

#ワーキングツリーからインデックスに登録し，コミットする
git commit -am 'message'

#コミットメッセージの変更
git commit --amend
```

###差分を出力する
ワーキングツリーとインデックスの差分を確認する．

```
git diff

#指定のファイルの差分
git diff filename

#ブランチやコミット間の差分
git diff ブランチ1  ブランチ2

#checkoutしてるブランチとインデックスとの差分
git diff --cached
```

###コミットログの表示
```
#コミットログを出力する
git log

#コミットログを要約して出力する
git shortlog

#コミットログを1行で出力する
git log --oneline
```

###ローカルリポジトリやワーキングツリーの状態を確認する
```
git status
```

####コミットに関する表示
* On branch master
    * この状態でコミットすると，masterブランチにコミットされる
* nothing to commit
    * ワーキングツリーとインデックスに対して変更がない．
* Changes to be committed
    * 表示されているファイルが次回のコミットの対象となっている．
* Changed but not updated
    * ワーキングツリーで変更されているが，その変更がインデックスに登録されていないことを表す．
* Untracked files
    * ワーキングツリーに存在するがGitの管理対象となっていない．

###ファイルの状態に関する表示
* new file
    * 新しくインデックスに表示されたファイル
* modified
    * ワーキングツリーやインデックスの状態から変更されていることを表す．
* renamed
    * ファイルを移動したり，フィアル名を変更したりした場合に表示される．
* deleted
    * ファイルを削除した場合に表示される．
* both modified
    * マージやリベースに失敗した場合で，複数のブランチで変更が加えられているファイルに対して表示される．
* unmerged
    * マージやリベースに失敗した場合で，both modified以外の時に表示される．

###ファイルの移動・変更/削除
```
#移動・変更
git mv

#削除
git rm
```

###ローカルリポジトリ，インデックスの状態を元に戻す
```
#HEADの参照とインデックス，ワーキングツリーの状態を戻す
git reset --hard

#HEADの参照のみを変更する
git reset --soft

#HEADの参照とインデックスを変更する.git resetのデフォルト
git reset -mixed
```

###ワーキングツリーをキレイにする
```
#リポジトリで管理されていないファイルの削除
git clean -f

#削除されるファイルの確認
git clean -n

#ディレクトリの削除
git clean -d
```

###特定の文字列の検索
```
git grep XXX
```

###コミット内容の表示
```
git show
```

##リモートリポジトリを用いる場合

###リモートリポジトリをクローン
```
git clone リモートリポジトリ
```

###リモートリポジトリの登録/更新/削除
```
#登録
git remote add リポジトリ名 パス

#更新
git remote update
#特定のリポジトリの更新
git remote update リポジトリ名

#削除
git remote rm リポジトリ名

#存在しなくなったブランチの削除
git remote prune
```

###ローカルリポジトリにリモートリポジトリのデータを反映する
```
#リモートリポジトリとブランチを指定して反映
git pull origin リモートブランチ
```

###git pullコマンドについて
git pullコマンドは，**git fetch**コマンドと**git merge**の組み合わせたものである．

###リモートリポジトリからリポジトリのデータを取得する
```
#リポジトリが登録済みの状態でブランチを指定
git fetch origin リモートリポジトリ
```
取得したデータは，**FETCH_HEAD**としてチェックアウトされる．

####fetchとremote updateの違い
* fetch
    * ブランチ単位で変更を取得
* remote update
    * リポジトリ単位で変更を取得

###ブランチをマージする
```
#ブランチを指定してマージ
git merge ブランチ名

#コミットメッセージを指定してマージ
git merge ブランチ名 -m 'message'
```

###リモートリポジトリにローカルリポジトリのデータを送信する
```
#リモートリポジトリ「origin」に「master」ブランチを送信
git push origin ローカルブランチ名

#反映先のブランチを指定
git push origin ローカルブランチ名:リモートブランチ名
```

####git pushがエラーになる場合
* どちらかのリポジトリにしかないコミットがある場合
* リモートブランチがチェックアウトされている場合

###ブランチの作成/確認/変更/削除
```
#ローカルリポジトリに作成
git branch ブランチ名

#ローカルブランチの確認
git branch 

#リモートトラッキングブランチの確認
git branch -r

#ブランチ毎の最新コミットの確認
git branch -v

#ブランチ名の変更
git branch -m ブランチ名(old) ブランチ名(new)

#ブランチの削除
git branch -d ブランチ名

#リモートブランチの削除(ローカルブランチを削除した後)
git push origin :ブランチ名
```

###ブランチのチェックアウト
```
git checkout ブランチ名
```

ワーキングツリーやインデックスで変更がありチェックアウトを行うと，**変更がそのまま他のブランチに反映される**．
但し，チェックアウト先のブランチで，同ファイルに変更があった場合はエラーとなる．

###タグ付け
```
#タグ一覧
git tag

#タグを付ける
git tag タグ名 リビジョン

#タグにメッセージを付ける
git tag -m 'message'

#リモートに反映
git push origin タグ名

#タグの削除
git tag -d タグ名

#直近のタグの表示
git describe
```

###指定したブランチにチェックアウトしているブランチのコミットを追従させる
```
git rebase ブランチ名
```

masterブランチからtestというブランチにチェックアウトし，編集・登録・コミットを行ってrebaseした場合，masterブランチのHEADにtestブランチのコミットが追従する．

###mergeとrebaseの違い
* merge
    * チェックアウトしているブランチにあるコミットを変更せず，各ブランチをマージする
* rebase
    * チェックアウトしているブランチのコミットを指定したブランチの最新コミットに追従させる．

つまり，mergeとrebaseではコミットに違いがでる．

##便利コマンド
###指定コミットのスナップショットを作成する
```
git archive --format=フォーマット名 --prefix=展開後のファイル名 コミット名 > ファイル名
```

###コミット状態を一時的に保存
```
#保存
git stash

#メッセージを付けて保存
git stash save メッセージ

#保存されたリストの表示
git stash list

#保存された内容を戻す
git stash pop

#保存された内容を全て削除
git stash clear
```

###ブランチに含まれないコミットを調べる
```
git cherry -v 調査元 調査先
```

###特定のコミットをブランチに取り込む
```
git cherry-pick 取り込みたいコミット
```

###バグが入り込んだ位置の特定
```
git bisect start
git bisect good
git bisect bad

#自動実行
git bisect run
```

###リポジトリのオブジェクトをキレイにする
```
git gc
```

###コミット履歴の時系列を表示
```
git reflog
```

###refspecとは
refspecとは，ローカルリポジトリとリモートリポ児とのブランチなどを紐付けるもの．
```
git push origin refs/hands/リモートブランチ(参照元):refs/hands/ローカルブランチ(参照先)
```

また，configでも指定可能．