gitのbranchの実体はポインタであるという話

勘違いしていたので、メモ。

  • gitにおける branch複数のcommitオブジェクトの集合体 だと思っていたが、こちらの記事 を読んで理解が誤っていたことに気が付いた
  • 実際は、gitにおける branch は任意のcommitオブジェクトの(アドレスを)指し示すポインターとして機能している

gitのデータ構造

恐らく以下のようになっている

  • HEAD はbranchに対するポインタ
  • branch はCommitオブジェクトに対するポインタ
  • Commitオブジェクト はSnapshot` [1] に対するポインタ
  • Snapshot は変更されたファイルに対応するblob全てへのポインタを持つ [2]

f:id:smatsuzaki:20200223103636p:plain:w350

公式ページの記載

gitの公式ページ でも以下のような記載があり、branch==ポインターであることが明示されている

"A branch in Git is simply a lightweight movable pointer to one of these commits."

上記の通りbranchは "movable" なポインターであり、新しくcommitを行う度に、branchが指し示すcommitオブジェクトのアドレスも、その新しく作られたcommitオブジェクトを指し示すよう、更新される

"The default branch name in Git is master. As you start making commits, you’re given a master branch that points to the last commit you made. "

参考

脚注

[1] 公式ページこちらの図 において "92ec2" と呼ばれているデータ構造のこと
[2] 公式ページでは、blobsは "each representing the contents of one of the three files" と説明されています。更新後のファイルの完全なデータ(差分ではなく完全バックアップといいますか..)だと推測しますが、詳細未確認です

/* https://sunrise033.com/entry/hatena-blog-how-to-hierarchicalize-categories */