Git 考え方

インデックス、ワークツリー、HEAD

HEAD とワークツリー

リポジトリの最後のコミットが HEAD で、 現在の状態がワークツリー。 当然、コミット直後は HEAD とワークツリーは同じ状態になる。 ファイルを変更するとワークツリーの状態が変わる。

インデックス

Git を使い始めてからしばらくの間、理解していなかったのだが、 HEAD とワークツリーの他にインデックスがある。 これはワークツリーで git add するとその変更がインデックスに 保存される。git commit するとインデックスがリポジトリの最後の コミットとして保存される。

インデックスの使い方

HEAD とワークツリーの間にインデックスがあるという 構造になる。 何がありがたいのかと言うと、インデックスのおかげで ワークツリーの一部だけを選んでコミットすることができる。 きちんと選択してコミットすることで、 リポジトリの履歴をきれいにする (一つのコミットで一まとまりの変更だけを記録する) ことができる。

ローカルブランチとリモート追跡ブランチ

ローカルブランチは git branch で表示されるブランチで、 編集してコミットすることができる。 リモート追跡ブランチは git branch -r で表示されるブランチで、 他のブランチを追跡するためのもので編集することはできない。

タグの種類

Git で使用するタグには、アノテーションがつかない軽量タグと アノテーションつきのタグがある。 アノテーションつきのタグにはサインのありなしがある。

  • アノテーションなし(lightweight tag)
  • アノテーションつきのタグ(annotated tag)
    • サインあり
    • サインなし

コミットの指定

キャレットとチルダ

キャレット「^」とチルダ「~」を使って親のコミットを指定できる。

HEAD^

は HEAD の親を示す。

HEAD^^

とすれば親の親となる。注意が必要なのは

HEAD^2

という指定は「HEAD^^」と異なり、2番目の親を表す。 状況としては merge されて作られたコミットに対しては 親が 2 つ以上あることになり、それらの親を区別するときに使用する。

親をさかのっていくためにはキャレットを複数つければ良いのだが、

HEAD^^^^^

と書くのは大変。こういうときにはチルダを使う。

HEAD~5

とすればよい。「~5」は5世代前のコミットという意味。

コミットメッセージに書くこと

コミットメッセージには、他の開発者が見てわかるように変更の理由を書いておくと良い。

参考

Tags of current page