gitのクリアな説明のために必要なことをまとめていく。
- オブジェクトグラフ: コミットグラフとファイルツリーを一緒にしたもの
- コミットグラフ: コミットをノードとするグラフ
- ファイルツリー: ツリーオブジェクトとblobオブジェクトをノードとするグラフ
- 履歴=歴史=過去集合=Ancestor-Or-Self集合
- ノード集合と誘導サブグラフ
- グラフの差分グラフ=ノードの差集合の誘導サブグラフ
- グラフの連結性、連結グラフ、非連結グラフ
- グラフの半束性、半束グラフ
- グラフのポート/成長点
- グラフの融合和〈amalgamation | amalgamated sum〉
- ファイルツリーのマージは融合和の一種
- ファイルツリーのマージにおけるコンフリクト
- ファイルのマージ
- ファイルのマージにおけるコンフリクト
- ラベルの参照先の自動更新
- グラフのリーフ集合=ヘッド集合
- グラフのルート集合
注意点:
- HEADラベル、ヘッドラベル、ヘッドノード、HEADノードは違う。
- ブランチラベルはヘッドラベルの一種。
- ヘッドラベルがヘッドノードを指すとは限らない。したがって、ブランチラベルがヘッドノードを指すとも限らない。
- HEADラベルはヘッドラベルだが、ヘッドラベルがHEADラベルとは限らない。
- ブランチラベルが直接指すのはcommitオブジェクトだが、意味的に過去集合を指すかも知れないし、過去集合の差集合を指すかも知れないし、ノード集合の誘導グラフを指すかも知れない。
- コミットグラフの融合和でコンフリクトが起きることは原理的にない。
- ファイルツリーのマージ(融合和の一種)ではコンフリクトが起きる。
- ファイルツリーのマージ失敗の原因は、同名で異なるデータ内容のファイル。
- ファイルをテキスト行のリストと解釈するなら、ファイルのマージは成功することがある。
- しかし、自動的にマージされたファイルは意味的にダメかも知れない。
- 最終的に、ファイルのマージは人間が行うしかない。
比較すること(差分を取ること):
- 特定のコミットとワーキングツリーは比較される。
- 任意の2つのファイルツリーは比較できる。比較した結果はデータとして表現可能。
- 任意の2つのテキストファイルは比較できる。比較した結果はデータとして表現可能。
- 比較は引き算に基づく。差分=引き算の結果の記述が問題になる。
- 差分=引き算の結果 は、rollforward, rollback するオペレーションのインストラクションになる。
- 差分=引き算の結果=ローリングスクリプト
三段階グラフモデルとマルチコンテント・ファイル
オブジェクトの種別、commitオブジェクト、treeオブジェクト、blobオブジェクト に応じてグラフも三段階に分ける。
- commitノードだけからなるコミットグラフ(DAG)
- ひとつのtreeオブジェクトをルートして構成されるファイルツリー(ツリー)
- ファイルツリーのファイルノードに対して単一または複数のblobオブジェクトを生やしたマルチコンテント・ファイル(blogのnamed list)
グラフの辺=リンクに関しては:
- コミットグラフの辺はparentリンク、辺ラベルはない。
- コミットノードからファイルツリーへの辺はtreeリンク、辺ラベルはない。
- treeノードからその他のtree/blobノードへの辺はitemリンク、辺ラベルあり。
- ファイルノードからblobノードへの辺はcontentリンク、辺ラベルはあるかも知れないが明示的ではない。
- ファイルノードに複数のコンテントノードがあると、コンフリクトツリーと呼ぶ。