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