勘違いしていたので、メモ。
- gitにおける
branch
は複数のcommitオブジェクトの集合体
だと思っていたが、こちらの記事 を読んで理解が誤っていたことに気が付いた - 実際は、gitにおける
branch
は任意のcommitオブジェクトの(アドレスを)指し示すポインターとして機能している
gitのデータ構造
恐らく以下のようになっている
HEAD
はbranchに対するポインタbranch
はCommitオブジェクトに対するポインタCommitオブジェクト
はSnapshot` [1] に対するポインタSnapshot
は変更されたファイルに対応するblob全てへのポインタを持つ [2]
公式ページの記載
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" と説明されています。更新後のファイルの完全なデータ(差分ではなく完全バックアップといいますか..)だと推測しますが、詳細未確認です