最終曎新:

【仕組み解説】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 ファむルの䞭身そのもの ハッシュ倀で識別
Gitオブゞェクトモデル — commit・tree・blobの関係
ひよこ ひよこ
Gitっお「コミット」ずか「ブランチ」ずかよく䜿うけど、䞭身はどうなっおるの
ペンギン先生 ペンギン先生
いい質問だね。Gitの正䜓は、プロゞェクトフォルダの䞭にある「.git」っおいう隠しフォルダなんだ。この䞭にファむルの党履歎がデヌタベヌスのように保存されおるんだよ。
ひよこ ひよこ
.gitフォルダの䞭には䜕が入っおるの
ペンギン先生 ペンギン先生
䞀番倧事なのは「objects」フォルダだよ。Gitは䞻に3皮類のオブゞェクトでファむル履歎を管理しおるんだ。たず「blob」はファむルの䞭身そのもの。「tree」はフォルダ構造を衚しおいお、どのblobがどのファむル名かを蚘録しおる。そしお「commit」はtreeのスナップショットに、䜜成者や日時、コミットメッセヌゞ、1぀前のコミット芪ぞの参照を付けたものだよ。この芪をたどっおいくず履歎が芋えるんだ。
ひよこ ひよこ
blob、tree、commitの3぀で党郚管理しおるっおこずすごくシンプルだね
ペンギン先生 ペンギン先生
そうなんだ。実は泚釈付きタグ甚の「tag」オブゞェクトもあるんだけど、履歎の骚栌はこの3぀だよ。しかもオブゞェクトは、内容から蚈算したハッシュ倀通垞のリポゞトリではSHA-1の40文字の英数字で識別されおるんだ。同じ䞭身のblobは必ず同じハッシュになるから、重耇を自動的に排陀できるし、デヌタが壊れおないかも怜蚌できる。git logで芋える「a1b2c3d...」みたいなのがたさにこのハッシュだね。
ひよこ ひよこ
じゃあブランチっお䜕なのファむルのコピヌを䜜っおるわけじゃないよね
ペンギン先生 ペンギン先生
鋭いねブランチの正䜓はただの「ポむンタ」なんだ。特定のcommitオブゞェクトのハッシュを指し瀺すだけのテキストファむルだよ。.git/refs/heads/mainを芗くず、40文字のハッシュが1行曞いおあるだけ参照の数が増えるず、たずめお.git/packed-refsに入るこずもあるよ。だからブランチの䜜成は䞀瞬で、ディスク容量もほが䜿わないんだ。
ひよこ ひよこ
えっ、たった1行のファむルなのじゃあHEADっおいうのは
ペンギン先生 ペンギン先生
HEADは「今どこにいるか」を瀺すポむンタだよ。ふ぀うは.git/HEADファむルに「ref: refs/heads/main」のように、珟圚チェックアりトしおいるブランチぞの参照が曞かれおる。ブランチを切り替えるず、この参照先が倉わっお、䜜業フォルダのファむルも切り替え先の内容に曎新されるんだ。タグや特定のコミットをチェックアりトするず、HEADにコミットのハッシュが盎接入る「detached HEAD」ずいう状態になるよ。
ひよこ ひよこ
マヌゞするずきは䜕が起きおるの
ペンギン先生 ペンギン先生
マヌゞには䞻に2皮類あるよ。「fast-forward」は、取り蟌み先が䞀盎線䞊にあるずき、ブランチのポむンタをそのたた先に進めるだけ。新しいコミットは䜜られない。䞀方「3-way merge」は、2぀のブランチが分岐しおるずき、共通の祖先コミットず䞡方の最新コミットの3぀を比范しお、新しい「マヌゞコミット」を䜜るんだ。
ひよこ ひよこ
rebaseっおいうのもあるよねマヌゞずどう違うの
ペンギン先生 ペンギン先生
rebaseは「ブランチの根元を付け替える」操䜜だよ。分岐元のコミットを最新に倉曎しお、自分のコミットを䞀぀ず぀䜜り盎すんだ。結果ずしお履歎が䞀盎線になっおきれいになるけど、コミットのハッシュが党郚倉わるから、共有枈みのブランチでやるず他の人ず衝突する。個人の䜜業ブランチで䜿うのが安党だね。
ひよこ ひよこ
もし間違えおresetしちゃったらどうしよう 
ペンギン先生 ペンギン先生
そんなずきはreflogが助けおくれるよ。「git reflog」を実行するず、自分のリポゞトリでHEADが過去に指しおいたコミットの履歎が芋られるんだ。resetやrebaseで消えたように芋えるコミットも、reflogにはしばらく残っおる既定では、どのブランチからもたどれなくなったものは30日、たどれるものは90日で期限切れ。「git reset --hard HEAD@{2}」のように「2回前のHEAD」を指定すれば戻せるよ。ただしreflogは手元のリポゞトリだけの蚘録で、ただコミットしおいない倉曎はresetで消えるず戻せないから気を぀けおね。
ひよこ ひよこ
reflogがあれば安心だねGitっお芋えないずころですごく賢い仕組みになっおるんだなあ。
ペンギン先生 ペンギン先生
そうだね。Gitの内郚は、䞻な3皮類のオブゞェクトずハッシュ、そしおポむンタずいうシンプルな仕組みの組み合わせなんだ。この基本を理解しおおくず、ブランチ操䜜やマヌゞで䜕が起きおるか芋えおきお、トラブルの察凊もずっず楜になるよ。

補足

ハッシュはSHA-1が既定ですが、SHA-256を䜿うリポゞトリ圢匏ぞの移行蚈画もありたす。Gitは2017幎のSHAttered攻撃埌、Git 2.13.0以降で攻撃を怜出する匷化版SHA-1を既定にしおいたす。ブランチの䜜成はポむンタを1぀䜜るだけですが、切り替えでは䜜業ツリヌのファむルも曞き換わりたす。この蚘事は公匏ドキュメントの説明をもずにした抂念図で、実際のファむル配眮パックファむルぞの圧瞮などは省略しおいたす。

参考資料

確認日2026幎9月21日。

  • Pro GitGit Objects — blob・tree・commitの構造、芪コミット、SHA-1によるオブゞェクト名、.git/objectsぞの保存。
  • Pro GitGit References — refs/heads内のブランチ、.git/HEADの「ref: refs/heads/ 」圢匏、detached HEAD。
  • git-reflog — ロヌカルの参照曎新履歎、HEAD@{n}、gc.reflogExpire90日ずgc.reflogExpireUnreachable30日。
  • Git hash function transition — SHA-1の匱点ず匷化版SHA-1、SHA-256ぞの移行蚈画。