← コース一覧
Gitの内部構造から理解する
「なぜコンフリクトが起きるのか」「なぜrebaseで履歴が変わるのか」。コマンドを先に覚えると、こうした疑問にぶつかったとき迷子になります。このコースはハッシュ化から出発し、blob・tree・commitという3種類のオブジェクトと、ブランチの正体である「40文字が書かれた41バイトのファイル」まで積み上げます。ブランチ切り替えが一瞬で終わる理由も、マージがポインタの付け替えで済む場合がある理由も、図と擬似体験で自分で説明できるようになります。
公式ドキュメント: Pro Git — Git Internals ↗第1部 ハッシュという土台
第2部 スナップショットの構造
第3部 ブランチとHEAD
第4部 日常の操作が腑に落ちる
- 7git add の正体 — ステージは「次のtreeの下書き」新卒がまず戸惑うのが「なぜcommitの前にaddが要るのか」です。内部構造から見ると、addとcommitはまったく別の仕事をしています。
- 8マージ — なぜポインタの付け替えで済むことがあるのかマージには大きく2つの場合があります。どちらになるかは「履歴が分岐しているかどうか」だけで決まり、内部構造を知っていれば事前に予測できます。
- 9コンフリクト — なぜ起きるのか、なぜ人間が要るのかコンフリクトは「Gitの不具合」でも「操作を間違えた罰」でもありません。3-way mergeの構造から、原理的に自動判断できないケースがあるというだけです。
- 10rebase — なぜ履歴が「書き換わる」のか「rebaseすると履歴が変わる」「共有ブランチでrebaseするな」とよく言われます。commitオブジェクトの構造を知っていれば、この理由は自分で導けます。
- 11detached HEAD と「消えたコミット」— 参照されないだけで残っている新卒が最も慌てるのが「detached HEAD」の警告と、コミットが消えたように見える場面です。ここも参照の構造で説明がつきますし、多くの場合コミットは消えていません。
- 12push と fetch — リモートとの間で何が運ばれるのか最後に、リモートリポジトリ(GitHub、GitLab、AWS CodeCommitなど)との同期を見ます。ホスティング先が変わっても、運ばれるものは同じです。