Git のデータ構造を図で整理


Git のデータ構造について図でまとめてみます。

大雑把にいうと、Git はオブジェクトと呼ばれるデータを保存する Key-Value ストアと、そのキーのラベルである参照の 2 つで構成されています。

オブジェクト

.git/objects が前述したオブジェクトを保存する Key-Value ストアです。

オブジェクトはヘッダとコンテンツの 2 つで構成されています。
ヘッダにはオブジェクトの型とサイズが格納されています。
コンテンツの内容は型によって異なります。

このヘッダとコンテンツをあわせたバイナリをハッシュしたものが Key-Value ストアのキーとなります。

オブジェクトは以下の 3 つの型などに分類されます。(※1)

  • blob
  • tree
  • commit

それぞれについて説明していきます。

blob

ファイルを表現します。

コンテンツにはファイルの実データが格納されています。

tree

ディレクトリを表現します。
tree オブジェクトはコンテンツに tree オブジェクト、または、blob オブジェクトの情報のリストを保持します。

各情報は「型」、「オブジェクトの Key」、「ファイル名またはディレクトリ名」で構成されます。
「型」には以下のようなものがあります。

解説
100644 ファイル
100755 実行可能ファイル
040000 ディレクトリ

blob オブジェクトと tree オブジェクトをあわせることでファイル構造を表現することができます。
(下図参照)

commit

プロジェクトのスナップショットを表現します。

commit オブジェクトは以下のものを保持します。

  • スナップショットのルートディレクトリを指す tree オブジェクトのキー
  • 親の commit オブジェクトのキー
  • 作者
  • 記録者
  • コメント

親の commit オブジェクトとは、直前のスナップショットを指します。
commit オブジェクトが複数あることで履歴を表現できます。

参照

参照とはオブジェクトのキーのラベルです。
ブランチ、タグはこの参照であり、commit オブジェクトなどのキーのラベルです。(※1)

参照は .git/refs に保存されており、ファイル名がラベル名を、実データにオブジェクトのキーを格納しています。

参考資料

この記事は以下の資料を参考にしています。
詳細に知りたい方はこれらの資料を確認してください。

注釈

※1 この記事では紹介していないコメント付きのタグを表現するオブジェクトの型が存在します。まだこの型については勉強不足なのでこの記事には書けませんでした。