我有一个关于可能的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中的任何修订仍然存在,则重复(循环)到第2步。
在上面的示例中,它看起来像:
合并B和B'
将结果与C
将结果与C'
将结果与D
依旧......
我无法解决的问题是 - 我的方式是否比传统的3版本合并更安全,更准确(非criss-cross merge)?
我可以通过传统方式避免冲突吗?
我的方式可以创造传统方式不会引起的新冲突吗?
我的方式冲突不是“真正的”冲突吗? (传统方式不会导致)
答案 0 :(得分:0)
我们希望将G和G'合并到分支1中。
为什么我们要将合并G合并到branch1? G已经在branch1中。在最好的情况下,我们不会从这次合并中给出任对于没有'
的所有其他修订版也是如此所以只有B' - G'需要合并到branch1。这是三方合并。
顺便说一句。三向合并的第三个组成部分不是“共同的祖先”,而是“基础”。共同的祖先可以是基础但不总是。