概要
コミットを実行した時、gitリポジトリにはblobオブジェクト、treeオブジェクト、commitオブジェクトが記録される。
コミットを時系列順に積み上げていく
blobオブジェクト
ステージング領域で指定されたファイル1つ1つはそれぞれblobオブジェクトというファイルとしてgitリポジトリに保存される。これが各ファイルの実質的なフルバックアップとなる。また、それぞれのblobオブジェクトの識別子はファイルの内容からSHA-1で算出したハッシュ値となる。
treeオブジェクト
gitで管理しているプロジェクト内の全てのディレクトリの内容(ファイル一覧)と、各ファイルに対応するblobオブジェクトを紐づけて、コミットを実行した時点におけるプロジェクト全体の状態を作成する。
各ファイルに対応するblobオブジェクトは、
- ステージングで指定されたファイルは新規のblobオブジェクト(今回のコミットで記録される)
- 上記以外のファイルのblobオブジェクトは直前のコミットにおけるtreeオブジェクトから引き継ぎ
となる。
一度もステージングされたことがないファイルは、treeオブジェクトにも入らないし、gitの管理対象にならない。
treeオブジェクトはコミットを実行する度に新規追加されてコミットと紐づけられる。そのため、あるコミット時点でのプロジェクト全体の状態(スナップショット)を表し、どこでも復元することを可能にしているのが、treeオブジェクトである。
commitオブジェクト
コミットに付随する情報とtreeオブジェクトへの参照などの情報を含むオブジェクト。
- コミットを実行した人
- コミット日時
- 今回のコミットで新規作成されたtreeオブジェクトへの参照
- 直前のコミットへの参照("親コミット"という)
※gitリポジトリの最初のコミットには親コミットは存在しない。
これらの情報を持っていることにより、commitオブジェクトから、
- コミットした時点のtreeオブジェクト(プロジェクトのスナップショット)の内容を見て、そこに紐づけされたblobオブジェクトからプロジェクト全体のファイル・ディレクトリの状態を復元することができる
- 親コミットを辿っていってgitリポジトリ全体の歴史(コミット履歴)を知ることができる