これはおそらく長い質問になると思いますので、ご容赦ください。
ここで、git マージの決定に関する信じられないほどの説明に出くわしました: How does git merge work。私はこの説明に基づいて構築しようとしており、このように git merge を描写することに穴があるかどうかを確認しています。基本的に、マージされたファイルに行が表示されるかどうかの決定は、真理値表で表すことができます。
W: 元のファイル、A: Alice のブランチ、B: Bob のブランチ
この真理値表に基づいて、D を構築するための行ベースのアルゴリズムを考えるのは簡単です。 A と B から対応する行を見て、真理値表に基づいて決定を下すことにより、D を行ごとに構築します。
私の最初の質問はケース (0, 0, 1) で、上に投稿したリンクによると、そのケースは実際には競合していますが、git は通常、とにかく行を削除することでそれを処理することを示唆しているようです。この場合、実際に紛争につながる可能性はありますか?
2 番目の質問は、削除のケース (0, 1, 1) と (1, 0, 1) についてです。直観的には、これらのケースの処理方法が問題につながる可能性があると感じています。W に関数 foo() があったとしましょう。この関数は実際にはどのコードでも呼び出されませんでした。ブランチ A で、アリスが最終的に foo() を削除することを決定したとしましょう。しかし、分岐 B で、ボブは最終的に foo() の使用を決定し、foo() を呼び出す別の関数 bar() を作成しました。直感的に、真理値表に基づいて、マージされたファイルは foo() 関数を削除し、bar() を追加することになり、Bob はなぜ foo() が機能しなくなったのか不思議に思うでしょう! おそらく、私が 3 通りのマージのために導き出した真理値表モデルは、おそらく完全ではなく、何かが欠けていると思いますか?