git日記

gitには4種類のオブジェクトがある。ブロブ、ツリー、コミット、タグ、の4つだ。

オブジェクトではないものがいくつかある。よく使うものはインデックスとリファレンスだ。

リファレンスにはタグ、ブランチトップ、リモートブランチトップ、そしてHEADがある。

ファイルをaddした時点で、そのファイルの内容を持ったブロブオブジェクトが作られる。ディレクトリをaddしてもツリーオブジェクトは作られない。commitした時点で作られる。

同一内容のファイルを作った場合、ブロブオブジェクトが再利用される。なぜならブロブオブジェクトにはファイル名などは入っておらずファイルの内容が同じなら同じ名前のオブジェクトになるから。

ツリーオブジェクトの中にある謎のバイナリ部分は、参照先のSHA-1ハッシュの値がhexでエンコードされずにそのまま入っているだけだった。

タグオブジェクトは tag -aとかやってアノテーション付きにした時だけ作られる。単なるタグはリファレンスだけ作られる。

このあたりのことを調べるために使ったコマンド

tree -D .git

cat .git/objects/71/abd6219437123ec763a034f2ed6296fe613d08 | python -c "import sys, zlib; print repr(zlib.decompress(sys.stdin.read()))"