Gitオブジェクト
「Git」では、「オブジェクトデータベース」に保存するデータを「オブジェクト」として扱います。従って「スナップショット」などのデータは、すべて「オブジェクト」という扱いになります。
これらのオブジェクトのことを、「Gitオブジェクト」と表現します。
Gitオブジェクトの実態
「Gitオブジェクト」の実態は、ファイルです。ユーザーが直接ファイルを見ても、何のファイルなのかは分かりません。
ユーザーは、「Git」を経由してオブジェクトにアクセスします。
Gitオブジェクトの識別子
各「Gitオブジェクト」は、一意になる識別子で識別されます。以前「データはチェックサムで管理される」を紹介しました。
このチェックサムが、各「Gitオブジェクト」を識別する識別子になります。
「Gitオブジェクト」の識別子は、「オブジェクト名(Object name)」とも表現されます。
Gitオブジェクトの種類
「オブジェクトデータベース」には、様々なデータ(Gitオブジェクト)が保存されます。そのため、データの種類(Object type)を識別するために、「Gitオブジェクト」には以下の種類が用意されています。
- コミットオブジェクト(Commit Object)
- ツリーオブジェクト(Tree Object)
- ブロブオブジェクト(Blob Object)
- タグオブジェクト(Tag Object)
スナップショットを構成するGitオブジェクト
「Gitオブジェクト」の種類のうち上記の「1.」から「3.」は、「スナップショット」で使用する「Gitオブジェクト」の種類です。言い換えれば「スナップショット」は、以下の「Gitオブジェクト」で構成されます。
- コミットオブジェクト(Commit Object)
- ツリーオブジェクト(Tree Object)
- ブロブオブジェクト(Blob Object)
コミットオブジェクト(Commit Object)
「スナップショット」の核となる「Gitオブジェクト」です。「スナップショット」を作成すると、「コミットオブジェクト」が作成されます。
作成された「コミットオブジェクト」は、リポジトリー内にある「オブジェクトデータベース」に保存されます。
「コミットオブジェクト」は、各「スナップショット」を識別する「Gitオブジェクト」になります。
ユーザーが「Git」で「スナップショット」に関する操作を行う際、この「コミットオブジェクト」を指定して操作を行います。
ユーザーから見ると、「スナップショット」=「コミットオブジェクト」となります。
コミットとは
「スナップショット」を作成し、「スナップショット」を「オブジェクトデータベース」に保存する行為を、「コミット」と表現します。変更履歴管理の主軸
ユーザーが「スナップショット」を作成するたびに、「コミットオブジェクト」が作成されます。作成した「コミットオブジェクト」同士を繋げることで、変更履歴管理を行います。
また同時に、「スナップショット」に必要な「ツリーオブジェクト」や「ブロブオブジェクト」も作成されます。
親コミットオブジェクト
2回目以降の「コミットオブジェクト」の作成では、直前に存在する「コミットオブジェクト」への参照を「コミットオブジェクト」に含みます。自分から見て直前に存在する「コミットオブジェクト」のことを、「親コミットオブジェクト(Parent Commit Object)」と表現します。
こうしてある「コミットオブジェクト」から、直前の「コミットオブジェクト」を辿ることができます。
「親コミットオブジェクト」を辿るということは、変更履歴を辿ることと同じです。
辿った「コミットオブジェクト」から、特定の時点のプロジェクトのファイル群を取得することができます。
また「親コミットオブジェクト」と比較することで、ファイルの差分を取得できます。
「親コミットオブジェクト」への参照は、コミットした状況により、以下のいずれかになります。
- 親コミットオブジェクトなし(最初のコミット)
- 親コミットオブジェクト1つあり(2回目以降の通常のコミット)
- 親コミットオブジェクト複数あり(マージコミット)
コミットオブジェクトに含まれる情報
「コミットオブジェクト」には、以下の情報が含まれています。- 親コミットオブジェクトへの参照
- ツリーオブジェクトへの参照
- コミットオブジェクトを作成したユーザー名
- コミットオブジェクトを作成した時間
- コミットオブジェクトを作成した理由
見ての通り、プロジェクトで使用するファイルの情報は含まれていません。
プロジェクトで使用するファイルの情報は、「ツリーオブジェクト」を参照することで取得します。