0

我有一个关于可能的 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 的下一个最接近的版本合并

  3. 将结果与分支 2 中的下一个最接近的版本合并(如果保留)

  4. 如果分支 1 中仍有任何修订,则重复(循环)到步骤 2。

在上面的示例中,它看起来像:

  1. 合并 B 和 B'

  2. 将结果与 C 合并

  3. 将结果与 C' 合并

  4. 将结果与 D 合并

  5. 等等...

我无法解决的问题是 - 我的方式是否比传统的 3 修订版合并更安全、更准确(在非交叉合并中)?

我的方式能避免传统方式引起的冲突吗?

我的方式能创造出传统方式不会引起的新冲突吗?

我的方式冲突不是“真正的”冲突吗?(传统方式不会导致)

4

1 回答 1

0

我们想将 G 和 G' 合并到分支 1。

为什么我们要将 G 合并到 branch1 中?G 已经在 branch1 中。在最好的情况下,我们不会从这个合并中得到任何东西,在最坏的情况下 - 冲突。没有 ' 的所有其他版本相同

所以只有 B' - G' 需要合并到 branch1。这就是三向合并。

顺便提一句。三向合并的第三个组成部分不是“共同祖先”,而是“基础”。共同祖先可以是基础,但并非总是如此。

于 2013-11-09T19:56:22.870 回答