この記事は
Gitに対する自分用の理解まとめです。こういう説明を受けたかったな、と思うように説明することを心がけるので、もし共感できる人がいれば参考にしていただければ嬉しいです。また、間違いの指摘もしていただけるとありがたいです(すぐ対応できるかはわかりませんが、少なくとも後でこのページを読んだ人が間違った理解を得るのを防ぐことができます)。
世界観
gitプロジェクトには三つの世界があります。
working tree
index
repository
代表的なコマンドがそれぞれの世界にどのような影響を与えるのか、というところがわかったら、おっかなびっくりコマンドを叩かないでも済むので、まずイメージから身につけると良いと思います。
working tree
working treeとはすなわち作業空間です。.git
以下を除くあなたが直接エディタ等で触れるファイル、ディレクトリ群はすべてここに属しています。おそらくこの想像がつかない人はいないと思います。大事なのは、今あなたが作業しているファイルと、今までの歴史(性格に言うとcommitの集まり、です。)は完全に別の世界にあるというイメージです。なので、あなたがここでどれだけ自由に振舞っても(git
関連のコマンドを除いて!)今までの歴史に存在するcommitに戻ることは簡単です。安心してください。
index
indexは一部保留された世界です。ここに加えられた変更(変更はファイル単位で数えられます。)達
はもう一度なかったことになることもできるし、歴史の一部に加わることもできます。歴史に加わった後ももちろんいくらでも元に戻ることができる上に、このような安全装置までついてるのだから、もうgitを怖がる理由は何もありませんね。ただしその安全装置を外すようなコマンドに対しては認識していなければなりません。大抵の場合はそのようなコマンドには--force
やら--hard
やら恐ろしげなオプション名が付いているので一目で危なそうとわかります。そのようなコマンドを扱うには注意が必要ですが、十分な理解を得た後なら柔軟な操作のために使うことがあってもよいでしょう。gitは整合性を保つためにしばしばなかなかめんどくさい操作を要求してくることがあり、そのたびたらい回しにされてる気持ちになります。そのコマンドのよって及ぼされる影響が想像ができないのなら、しばらくはその危険なコマンドは封印した方がいいでしょう。
ちなみにこのindexは実体としては.git/index
以下に存在しますが、ここの存在を気に掛ける必要は通常ありません。
repository
リポジトリこそがgitがgitである所以であり、すべてのソースコードの歴史が""そのまま""入っています。repositoryの最小単位commit
はgit commit
コマンドでindexより生成されることは知ってるかもしれません(知らなくても大丈夫、あとで解説します)。結局のところgitのほとんどのコマンドは「歴史」---commitを元に「今」---working treeを書き換えるか、その逆、「今」を元に「歴史」を書き換えるか、あるいは「歴史」そのものを操作するかの三つに大別されると言っていいでしょう。
ここまでのまとめ
gitには三つの世界がある
三つの世界はそれぞれworking tree、index、repositoryといい、今、今と歴史の中間、歴史を表す。
大抵のことはやっても大丈夫
なお、リモートリポジトリのことはとりあえず後に置いておきます。といってもそれもさっきいった概念から大きく外れるものではありません。離れた場所にあるプロジェクトディレクトリの歴史で、多くはローカルの歴史と一致するでしょうが、少しだけ歴史が食い違ってる部分があるかもしれません(遠隔地でも時は過ぎますからね)というだけの話です。
次はgit add, commit, resetについて解説しようと思います。