Dev Study
← Gitの内部構造から理解する コース

5. ブランチの正体 — 40文字が書かれた41バイトのファイル

ここまでで、コミットの鎖ができました。しかし40文字のハッシュを人間が覚えるのは無理です。そこでGitは「名前 → コミットハッシュ」の対応を作ります。それがブランチで、実体は驚くほど単純です。

① ブランチファイルの中身を見てみる

.git/refs/heads/main の中身
cat .git/refs/heads/main実行してみると
出力はこれだけ
0978f6e0f0104f58cbe501b4364a1da8ae314d9540文字 + 改行 = 41バイト
  • ・ブランチは「コミットを指すポインタ」であり、コミットの集合ではない
  • ・ブランチを作る = 41バイトのファイルを1つ増やすだけ
  • ・だからブランチ作成は一瞬で終わり、容量もほぼ増えない

「ブランチを切る」というと枝分かれした作業空間を作るイメージですが、実際に作られるのはこの41バイトのファイル1つです。

② HEADは「今どのブランチにいるか」を指す

HEAD → ブランチ → コミット という二段の参照
.git/HEAD中身: "ref: refs/heads/main"
が指す先
.git/refs/heads/main中身: 0978f6e0…
が指す先
commit 0978f6e0…オブジェクトDBの中
  • ・HEADは通常ブランチ名を指す(間接参照)
  • ・コミットすると、HEADが指しているブランチファイルの中身が新しいハッシュに書き換わる
  • ・HEADがコミットを直接指す状態が detached HEAD

コミットしたときにブランチが自動で進むのは、この二段構造のおかげです。HEADの先にあるブランチファイルだけが書き換わります。

③ ブランチ切り替えが一瞬で終わる理由

git checkout で実際に起きること
git checkout feature
① HEADの中身を書き換える
"ref: refs/heads/feature"数十バイトの書き込み
② その先のコミットのtreeを読む
作業ツリーを並べ直すオブジェクトは既にDBにある。作成は0個
  • ・切り替えでオブジェクトは1つも作られない。既にあるものを展開するだけ
  • ・コピーもダウンロードも発生しない(ローカルブランチの場合)
  • ・変更のないファイルは触られないため、実際にはさらに速い

ブランチ切り替えが速いのは最適化の結果ではなく、そもそも「やることが少ない」からです。次のレッスンで実際に手を動かして確かめます。

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗