Gitコマンド総選挙

こんにちは [id:akiyoko](http://akiyoko.hatenablog.jp/) です。
今回は、[Git Advent Calendar 2012](http://qiita.com/advent-calendar/2012/git-scm) の 16日目の記事になります。


今日は総選挙の日ですよね。
そう、Gitコマンド総選挙ですよ！

業務で一年間がっつり Git を使いまくった経験から、独断と偏見により、本当に使える Gitコマンドを総選挙（ランキング）したいと思います！

ちなみに、一年間関わってきたのは、

```
・githubのプロジェクトをfork
・機能追加・バグ修正はトピックブランチを作成し、ワンコミットにして本体にマージ
```

というプロジェクトでした。

さてさて、堂々のセンターを飾るのは・・！？

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 1 位　<b><i>git checkout</i></b>

ババーン！ みんな大好き <b><i>git checkout</i></b> が、文句なしの第 1 位です！
よそ者（SVNを使ってきた人）からは誤解されやすいけど、いろんな場面で活躍するセンターな立ち位置、それが <b><i>git checkout</i></b> なんですよねー。

「<b><i>checkout</i></b> のことは嫌いでも、Git のことは嫌いにならないでください！」


#### 基本的な使い方
```
git checkout ＜ブランチ名＞　：ブランチを（すでにあるブランチに）切り替える

（例）
・git checkout my_branch
```

#### よく使うオプション
```
 -b　：新たにブランチを作成しつつ、ブランチを切り替え

（例）
・git checkout -b my_branch　：今いるブランチを元にして新しいブランチを作成
・git checkout -b my_branch origin/his_branch　：リモートブランチを元にして新しいブランチを作成
```
```
 --　：（ステージされていない）変更の取り消し

（例）
・git checkout -- my_file
```

ちなみに、今いるブランチがどのブランチを元に作ったか分からなくなってしまったときは、 <b><i>git show-branch</i></b> すれば確認できますよ。

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 2 位　<b><i>git status</i></b>

気がついたらタイプしている、そんな身近なクラスメイトみたいなコマンド <b><i>git status</i></b> が第 2 位です！　何かあったらとりあえず叩いとけって感じで、もしかしたら回数的には一番使ったかもしれないコマンドですね（笑）。


#### 基本的な使い方
```
git status　：変更されたファイルを表示する
```

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 3 位　<b><i>git diff</i></b>

ちょっと扱いが難しいけど、慣れれば手放せなくなるコマンド、 <b><i>git diff</i></b> が第 3 位です！
バグ修正に欠かせないコマンドですよね。

#### 基本的な使い方
```
git diff　：全ての変更点を差分表示
git diff ＜ファイル名＞　：ファイル単位の変更点を差分表示
```
ステージされていない（＝addされていない）変更点を表示します。

#### よく使うオプション
```
 --stat　：ファイル一覧形式で表示
```
```
 --cached　：ステージ済みの変更点と直前のコミットとの差分を表示
```


#### いろんな使い方
```
パッチを作る
 git diff > hoge.patch
```
作成したパッチは、「patch -p1 < hoge.patch」で当てることができます。

```
コミット前後の差分を表示（git show ＜コミットID＞ とほぼ同じ）
git diff ＜コミットID＞~ ＜コミットID＞
```
「このコミット、どんな変更だっけ？」というのをチェックするのにすごく便利です。

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 4 位　<b><i>git commit</i></b>

「やっぱりこいつがいないと締まらないよね」という存在感のあるコマンド、 <b><i>git commit</i></b> が第4位です！

第 1 位の <b><i>git checkout</i></b> と並んで、よそ者（SVNを使ってきた人）から誤解されやすい代表のコマンドですよね。「commit で終わりじゃないの？」と思ったのも遠い昔。こんなに遠くまで来てしまいました。。

#### 基本的な使い方
```
git commit -m ＜コミットコメント＞　：スーテジされたファイルをコミット

（例）
・git commit -m "Fix typo in __init__."
```

#### よく使うオプション
```
 --amend　：直前のコミットを取り消してコミットをし直す

（例）
・git checkout --amend
```
コミットコメントをTYPOしてしまったときや、（レビューやマージのために）直前のコミットと合わせてワンコミットにしたいときなどに重宝しますよ。

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 5 位　<b><i>git pull</i></b>

第 5 位は、「まあ当然ランキングには入ってくるだろうな」といういい意味で無難なコマンド、 <b><i>git pull</i></b> です。

#### 基本的な使い方
```
git pull ＜取得元リポジトリ名＞ ＜取得元ブランチ名＞　：他のブランチから変更を取得する

（例）
・git pull origin master
```
fetch して merge されるので pull の前に fetch は要らないのですが、普段は、ブランチに変更があるかどうかを fetch でチェックしてから使ってますね。

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 6 位　<b><i>git stash</i></b>

これひとつ覚えるだけで、ブランチの移動とかがうんと身軽になって小回りが利くようになりますよね。
そんな器用系愛されコマンド、 <b><i>git stash</i></b> が第 6 位です！

#### 基本的な使い方
```
git stash　：現在の（ステージされていない）変更点を一時的に保存
```

#### いろんな使い方
```
git stash pop　：stash に最後に保存した状態を適用する
```
```
git stash list　：stash に保存した一覧を表示
```

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 7 位　<b><i>git cherry-pick</i></b>

やんちゃ系つまみ食いアイドルコマンド、<b><i>git cherry-pick</i></b> が第 7 位です。
merge でもいいんですが、基本方針としてワンバグ＝ワンコミットでトピックブランチを作っていたので、 <b><i>git cherry-pick</i></b> の方が何かと便利でした。

#### 基本的な使い方
```
git cherry-pick ＜コミットID＞　：他のブランチの任意のコミットを適用する
```
cherry-pick する前に fetch をよく忘れるので、ご注意をば。

#### よく使うオプション
```
 --no-commit　：コミットしない

（例）
・git cherry-pick --no-commit 9f297857
```

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 8 位　<b><i>git branch</i></b>

地味だけどよく使うコマンド、<b><i>git branch</i></b> が第 8 位です。
今いるブランチ何だっけ？と確認したり、ブランチ名を変更したり、ブランチを削除したり、よく使うんだけど派手さがないんですよねぇ。

#### 基本的な使い方
```
git branch　：ブランチ一覧の表示
```

#### よく使うオプション
```
 -a　：リモートブランチも含めて一覧表示
```
```
 -D　：ブランチを削除

（例）
・git checkout -D my_branch
```
```
 -m　：ブランチ名を変更

（例）
・git checkout -m my_branch renamed_branch
```

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 9 位　<b><i>git blame</i></b>

第 9 位は、小悪魔系コマンド <b><i>git blame</i></b> です。
いわゆる犯人探しコマンドです（笑）。

「UTを死なせたのはあなたです！てへぺろ☆」

特定のファイルに変更が加わったコミットを探す「git log ＜ファイル名＞」や、犯人をある程度絞った上でコミットを探す「git log --author ＜ユーザ名＞」などと組み合わせるとより一層効果的で楽しいですよね。楽しいですよね ♩

#### 基本的な使い方
```
git blame ＜ファイル名＞　：各行ごとの最終更新コミットIDを表示
```

　
# ![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/akiyoko/20121216/20121216022707.jpg) 第 10 位　<b><i>git reset</i></b>

第 10 位は ラストにふさわしく、使い方を間違えるとどえらい事になってしまう Git の最終奥義系コマンド（笑） <b><i>git reset</i></b> です。
hard と soft で全然意味が違うので、使う前に指差し確認必須ですぞ！！

#### 基本的な使い方
```
git reset --hard ＜コミットID＞　：ファイルの状態を含めて、特定のコミットまでコミットを取り消す

（例）
・git reset --hard 9f297857　：特定のコミット時点に状態を戻す
・git reset --hard HEAD　：何が何でもHEADの状態に戻す
```
全てを巻き戻す最終奥義。間違っても取り消せないので注意！！

```
git reset --soft ＜コミットID＞　：ファイルの状態はそのままで、特定のコミットまでコミットを取り消す
```
コミット情報だけ取り消します。ファイルは戻しません。



というわけで、独断と偏見による Gitコマンド総選挙でした。
この10コくらい覚えてれば、特に困ることはないように思います（あとは push と rebaseくらい？）。


気合い入れて長文になり過ぎました。。
明日は、 a_suenami さんにバトンタッチです。よろしくお願いしまーす。