はじめに
Gitのバージョン管理の本質を理解する上で、.git/objectsディレクトリは非常に重要な役割を果たします。今回は、この部分にフォーカスした理解を記事にまとめます。
Gitオブジェクトの種類
Gitには4つの主要なオブジェクトタイプがあります
- Blob(ブロブ)
- Tree(ツリー)
- Commit(コミット)
- Tag(タグ)
1. Blob(ブロブ)
ファイルの内容そのものを保存するオブジェクトです。ファイル名や属性は含まず、純粋なデータのみを保存します。
2. Tree(ツリー)
ディレクトリの構造を保存します。ファイル名、パーミッション、各ファイルやサブディレクトリへの参照を含みます。
3. Commit(コミット)
プロジェクトの特定の時点のスナップショットを表現します。
4. Tag(タグ)
特定のコミットオブジェクトに名前をつけたオブジェクトです。リリースのバージョンなどでtagをつけた際に保存されます。
オブジェクトの保存方法
オブジェクトの保存は以下の方法で行われます。
- オブジェクトのデータをzlib圧縮
- SHA-1ハッシュを生成
- .git/objects/[ハッシュ先頭2文字]/[残りのハッシュ] として保存
実際にオブジェクトを確認してみる
実際にコマンドでそれぞれのオブジェクトを確認してみましょう。
1. Gitリポジトリを初期化する
mkdir git-internals-demo
cd git-internals-demo
git init
2. ファイルを作成する
echo "hogehoge" > test.txt
mkdir tests
echo "hogehoge" > tests/test1.txt
3. ファイルをステージングエリアに追加する
git add test.txt
add
した地点でblob
オブジェクトが作成され保存されます。
ここで今回保存した内容を確認してみましょう。
hash=$(git hash-object test.txt)
git cat-file -p $hash
hogehoge
と表示されるはず。
また、tree .git
でコマンドを叩いてみても、.git/objects
の中に新しくファイルが生成されているのが確認できると思います。
4. 作成したファイルを全てコミットする
git add .
git commit -m "Check Git object for tests"
commit
するとtree
オブジェクトとcommit
オブジェクトが作成され、保存されます。
今回も内容を確認してみましょう。
# 最新のコミットハッシュを取得
commit_hash=$(git rev-parse HEAD)
# コミットオブジェクトを確認
git cat-file -p $commit_hash
出力として以下のようなものが出ると思います
tree <tree_hash>
author Your Name <your.email@example.com> 1733133160 +0900
committer Your Name <your.email@example.com> 1733133160 +0900
Check Git object for tests
今回の出力で得られた<tree_hash>
を確認してみましょう
# コミットオブジェクトを確認
git cat-file -p <tree_hash>
出力として以下のようが得られたのではないでしょうか
100644 blob <blob_hash> test.txt
040000 tree <subtree_hash> tests
タグの作成
# タグの作成
git tag -a v1.0 -m "Version 1.0 tag"
tagオブジェクトの確認
tag_hash=$(git rev-parse v1.0)
# タグオブジェクトを確認
git cat-file -p $tag_hash
出力として以下のようが得られたのではないでしょうか
object <commit_hash>
type commit
tag v1.0
tagger Your Name <your.email@example.com> 1733133967 +0900
Version 1.0 tag
参考