最終更新:

【仕組み解説】Gitはどうやってファイルの履歴を管理しているのか — 内部構造を図解


Gitオブジェクトモデル main feature HEAD commit a1b2c3d commit e4f5g6h tree フォルダ構造 tree フォルダ構造 blob index.html blob style.css 同じblobを共有 blob app.js Gitの3つのオブジェクト commit 作成者・日時・メッセージ + 親commitへの参照 tree ディレクトリ構造を記録 ファイル名とblobの対応 blob ファイルの中身そのもの SHA-1ハッシュで識別
Gitオブジェクトモデル — commit・tree・blobの関係
ひよこ ひよこ

Gitって「コミット」とか「ブランチ」とかよく使うけど、中身はどうなってるの?

ペンギン先生 ペンギン先生

いい質問だね。Gitの正体は、プロジェクトフォルダの中にある「.git」っていう隠しフォルダなんだ。この中にファイルの全履歴がデータベースのように保存されてるんだよ。

ひよこ ひよこ

.gitフォルダの中には何が入ってるの?

ペンギン先生 ペンギン先生

一番大事なのは「objects」フォルダだよ。Gitは3種類のオブジェクトでファイル履歴を管理してるんだ。まず「blob」はファイルの中身そのもの。「tree」はフォルダ構造を表していて、どのblobがどのファイル名かを記録してる。そして「commit」はtreeのスナップショットに、作成者や日時、コミットメッセージを付けたものだよ。

ひよこ ひよこ

blob、tree、commitの3つで全部管理してるってこと?すごくシンプルだね!

ペンギン先生 ペンギン先生

そうなんだ。しかもすべてのオブジェクトはSHA-1ハッシュっていう40文字の英数字で識別されてるよ。ファイルの中身が同じなら必ず同じハッシュになるから、重複を自動的に排除できるし、データが壊れてないかも検証できる。git logで見える「a1b2c3d...」みたいなのがまさにこのハッシュだね。

ひよこ ひよこ

じゃあブランチって何なの?ファイルのコピーを作ってるわけじゃないよね?

ペンギン先生 ペンギン先生

鋭いね!ブランチの正体はただの「ポインタ」なんだ。特定のcommitオブジェクトのハッシュを指し示すだけのテキストファイルだよ。.git/refs/heads/mainを覗くと、40文字のハッシュが1行書いてあるだけ。だからブランチの作成は一瞬で、ディスク容量もほぼ使わないんだ。

ひよこ ひよこ

えっ、たった1行のファイルなの!?じゃあHEADっていうのは?

ペンギン先生 ペンギン先生

HEADは「今どのブランチにいるか」を示すポインタだよ。.git/HEADファイルの中身は「ref refs/heads/main」のように、現在チェックアウトしているブランチへの参照が書かれてる。ブランチを切り替えると、この参照先が変わるだけなんだ。

ひよこ ひよこ

マージするときは何が起きてるの?

ペンギン先生 ペンギン先生

マージには主に2種類あるよ。「fast-forward」は、取り込み先が一直線上にあるとき、ブランチのポインタをそのまま先に進めるだけ。新しいコミットは作られない。一方「3-way merge」は、2つのブランチが分岐してるとき、共通の祖先コミットと両方の最新コミットの3つを比較して、新しい「マージコミット」を作るんだ。

ひよこ ひよこ

rebaseっていうのもあるよね?マージとどう違うの?

ペンギン先生 ペンギン先生

rebaseは「ブランチの根元を付け替える」操作だよ。分岐元のコミットを最新に変更して、自分のコミットを一つずつ作り直すんだ。結果として履歴が一直線になってきれいになるけど、コミットのハッシュが全部変わるから、共有済みのブランチでやると他の人と衝突する。個人の作業ブランチで使うのが安全だね。

ひよこ ひよこ

もし間違えてresetしちゃったらどうしよう…?

ペンギン先生 ペンギン先生

そんなときはreflogが助けてくれるよ。「git reflog」を実行すると、HEADが過去に指していたコミットの履歴が全部見られるんだ。resetやrebaseで消えたように見えるコミットも、reflogにはしばらく残ってる。「git reset --hard HEAD@(2)」のように指定すれば復元できるよ。

ひよこ ひよこ

reflogがあれば安心だね!Gitって見えないところですごく賢い仕組みになってるんだなあ。

ペンギン先生 ペンギン先生

そうだね。Gitの内部はたった3種類のオブジェクトとハッシュ、そしてポインタというシンプルな仕組みの組み合わせなんだ。この基本を理解しておくと、ブランチ操作やマージで何が起きてるか見えてきて、トラブルの対処もずっと楽になるよ。