VCS理论 - 合并:递归revrision合并或3修订合并?

时间:2013-11-08 13:01:44

标签: version-control merge diff patch diff3

我有一个关于可能的VCS合并的理论问题。 我知道很多VCS使用3次修订合并,这是共同的祖先,“我的”和“你的”修订版。我知道它们是如何工作的。

我想过另一个替代方案,递归修订合并,还没有在谷歌找到这个。 “你找到了美国!”你可能认为。我知道Git使用递归合并。 但是Git使用递归合并的原因是criss-cross merge

我说的是正常情况,非纵横交错。

例如,我们有一个共同的祖先,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. 中的下一个最接近的修订版合并
  4. 将结果与分支2中的下一个最接近的修订版合并(如果保留)

  5. 如果分支1中的任何修订仍然存在,则重复(循环)到第2步。

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

    1. 合并B和B'

    2. 将结果与C

    3. 合并
    4. 将结果与C'

    5. 合并
    6. 将结果与D

    7. 合并
    8. 依旧......

    9. 我无法解决的问题是 - 我的方式是否比传统的3版本合并更安全,更准确(非criss-cross merge)?

      我可以通过传统方式避免冲突吗?

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

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

1 个答案:

答案 0 :(得分:0)

  

我们希望将G和G'合并到分支1中。

为什么我们要将合并G合并到branch1? G已经在branch1中。在最好的情况下,我们不会从这次合并中给出任对于没有'

的所有其他修订版也是如此

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

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