LoginSignup
40
34

More than 5 years have passed since last update.

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

Posted at

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

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

オブジェクト

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

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

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

1.png

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

  • blob
  • tree
  • commit

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

blob

ファイルを表現します。

2.png

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

tree

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

3.png

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

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

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

4.png

commit

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

5.png

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

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

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

6.png

参照

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

7.png

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

参考資料

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

注釈

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

40
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
34