我有一个关于可能的 VCS 合并的理论问题。我知道许多 VCS 使用 3 个修订合并,即共同祖先、“我的”和“您的”修订。我知道它们是如何工作的。
我考虑过另一种替代方法,递归修订合并,在 Google 中没有找到。“你找到了美国!” 你可能认为。我知道 Git 使用递归合并。但是 Git 使用递归合并的原因是交叉合并
我说的是正常情况,非交叉合并。
例如,我们有一个共同的祖先 A 和分支 1 和 2。
branch 1: B, C, D, E, F, G
branch 2: B', C', D', E', F', G'
如前所述,A 是共同祖先,因此它是 B 和 B' 的父级。
我们希望将 G 和 G' 合并到分支 1。Git 和 Mercurial 使用的常用方式是 diff3:
diff3(ancestor = A, mine = G, yours = G')
这将仅通过计算 3 个版本来计算合并,即 O(1)。
我想到的替代算法是 O(n):
首先将最接近的修订合并到祖先。
将结果与分支 1 的下一个最接近的版本合并
将结果与分支 2 中的下一个最接近的版本合并(如果保留)
如果分支 1 中仍有任何修订,则重复(循环)到步骤 2。
在上面的示例中,它看起来像:
合并 B 和 B'
将结果与 C 合并
将结果与 C' 合并
将结果与 D 合并
等等...
我无法解决的问题是 - 我的方式是否比传统的 3 修订版合并更安全、更准确(在非交叉合并中)?
我的方式能避免传统方式引起的冲突吗?
我的方式能创造出传统方式不会引起的新冲突吗?
我的方式冲突不是“真正的”冲突吗?(传统方式不会导致)