目からうろこ!日本一わかりやすくGitの本質を解説してみた

Gitの本質は「コミットオブジェクトのチェーン」


  • コミットには親子関係がある。
  • 子は親を参照している。
  • 子の名前(=コミットハッシュ値)が特定できれば先祖をたどれる。
コミットオブジェクトがチェーンのようにつながっているので、「コミットオブジェクト・チェーン」と理解しましょう

Gitとは、コミットオブジェクトのチェーンなのです。
(専門的には「オブジェクトグラフ」と言います)

ブランチとは枝のことではない

ほとんどの初心者が勘違いしていますが、ブランチとは「枝」のことではありません。
ブランチの正体は「立て看板」です。
「ラベル」といってもよいでしょう。
それは、コミットオブジェクトにつけられらた「別名」のことです。

下記の図でいうと、"branchX"とはコミット"C"を指します。



「アメリカ大統領」という言葉と「バラク・オバマ」という言葉は、同一人物を指しますよね?
まさにそれといっしょです。

「え、それってタグじゃないの?」と思ったあなた、正解です。
ブランチもタグも本質的には同じなのです。
どちらも、ある単一のコミットオブジェクトを指す別名です。

「立て看板」は勝手に進む

「だるまさんが転んだ」という遊びをやったことはあるでしょうか?
あなたが「だ~るまさんが~~~ころんだ!!」と言い終わって振り向いたとき、あたなの友達は、いつのまにか一歩進んでいたはずです。

ブランチの動きはまさにこれです。
あなたがコミットメッセージを記入してコミットを終えたとき、立て看板は勝手に一歩進みます。



タグは、動きません。
これがブランチとタグの違いです。

徳川将軍家でたとえてみる

徳川15代将軍の家系図で考えてみましょう。
家康 ← 秀忠 ← 家光 ← ・・・ ← 慶喜
ブランチ=「徳川家」と理解してる人が多いのではないでしょうか?それは間違いです。
Git内部には「系列」という概念はないのです。
あるのは、さっきの絵で示した「コミットオブジェクトチェーン」と「立て看板」だけです。
ブランチ=「将軍」というのが正しい理解です。
ブランチとは枝のことでなく看板のことだからです。

「将軍」という言葉が指す個人は、時代が進むにつれて変わります。
1867年時点で「将軍」と言えば、それは徳川慶喜のことです。
翌年に明治維新がおこって「将軍」という呼称は消えてしまいましたが、慶喜個人は生き続けました。
これもGitとよく似ています。
ブランチを消したら看板は消えますが、コミットオブジェクトそのものは(しばらくは)残ります。

21世紀の現代、たんに「将軍」といっても誰を指すのかわかりません。
でも、「徳川慶喜」とフルネーム(=コミットハッシュ値)で呼ぶか、「徳川家最後の将軍」というレッテル(=タグ)で呼べば、歴史上の一個人を特定することができます。

「枝」のことは忘れましょう

Gitには枝なんかないのです。
あるのは「コミットオブジェクトのチェーン」だけです。
これがGitの真実です。

こう考えれば、いろんなもやもやがすっきりしたのではないでしょうか?
この記事があなたがGitを理解する手助けになれば幸いです。

この辺の話を深堀りしたい方は「入門Git」をどうぞ。

カテゴリ: