この記事の要点
• Gitは4種類のオブジェクト(blob・tree・commit・tag)でデータを管理する
• ブランチは単なるコミットへのポインタであり、データコピーは発生しない
• SHA-1ハッシュにより同一内容の重複を効率的に排除する
Gitの基本概念
Gitは分散型バージョン管理システムです。各開発者がリポジトリの完全なコピーを持ち、オフラインでも作業できます。
Gitの特徴: スナップショット方式でファイルを管理し、差分ではなく状態全体を記録します。
Gitオブジェクトの種類
Gitは4種類のオブジェクトでデータを管理します:
1. Blob(Binary Large Object)
ファイルの内容を格納するオブジェクトです。ファイル名は含まず、純粋なデータのみを保持します。
# blobオブジェクトの確認
git cat-file -p <blob-hash>
2. Tree
ディレクトリ構造を表すオブジェクトです。blobや他のtreeへの参照とファイル名を持ちます。
3. Commit
スナップショットを記録するオブジェクトです:
- トップレベルのtreeへの参照
- 親コミットへの参照
- 作者・コミッター情報
- コミットメッセージ
4. Tag
特定のコミットに名前を付けるオブジェクトです。リリースバージョンの管理に使用されます。
SHA-1ハッシュ
全てのオブジェクトはSHA-1ハッシュで識別されます。同じ内容なら同じハッシュになるため、重複データを効率的に排除できます。
# オブジェクトのハッシュを確認
git hash-object README.md
# コミットハッシュの確認
git log --oneline
ブランチの仕組み
ブランチは単なる「コミットへのポインタ」です。新しいブランチを作成しても、ポインタが1つ増えるだけで、データのコピーは発生しません。
# ブランチの実体(.git/refs/heads/main)
cat .git/refs/heads/main
# → コミットハッシュが表示される
HEADとは: 現在チェックアウトしているブランチを指すポインタです。.git/HEADファイルに記録されています。
実践メモ: git reflogコマンドを使えば、HEADの移動履歴を確認できます。誤ってブランチを削除した場合でも、reflogからコミットを復元できます。
マージの種類
Fast-forward マージ
分岐がない場合、ポインタを単純に進めるだけで完了します。
3-way マージ
分岐がある場合、共通の祖先と両方のブランチを比較して新しいマージコミットを作成します。
ポイント: Fast-forwardマージはコミット履歴が一直線になりますが、3-wayマージではマージコミットが作成されます。--no-ffオプションで常にマージコミットを作成することも可能です。
注意: git reset --hardやgit push --forceは履歴を書き換える危険な操作です。チーム開発では十分注意して使用してください。
まとめ
Gitは、blob・tree・commit・tagの4種類のオブジェクトとSHA-1ハッシュを使って、効率的かつ信頼性の高いバージョン管理を実現しています(Git 2.29以降はSHA-256にも対応)。ブランチがポインタに過ぎないことを理解すると、Gitの操作がより直感的になります。
参考リソース
- Git Documentation
- Pro Git Book
- Git Internals - Plumbing and Porcelain
- Git Internals - Git Objects
- Git SHA-256 Transition