【发布时间】:2016-04-03 01:22:13
【问题描述】:
Git 实现了solves problems with criss-crossing histories 的recursive 3-way merge 策略,但是这个策略没有解决什么问题?
目前我发现的最好的帐户是old revctrl wiki:
递归三路合并通常提供正确的答案,但也有一些极端情况。例如,冲突标记可能会被错误地匹配,因为它们没有为合并算法赋予任何特殊的语义含义,并且被简单地视为行。特别是,有(有些复杂的)两个不相关冲突的冲突标记相互匹配的情况,即使它们的内容部分完全不相关。
此外,递归合并可以执行一些与SimpleWeaveMerge 相同的无效合并,如下所述,尽管它在这些情况下的确切作用高度依赖于 3 路合并算法的细节,但它不是不清楚将 3 路合并算法调整为更加保守地显示冲突将使此类问题消失。基本上,包括冲突就是创建一个编织,这就引入了编织的问题。
最后,递归三路合并具有ImplicitUndo的所有固有问题。特别是,将多个干净合并的事物合并在一起有时会根据合并发生的顺序给出不同的答案。事实上,在一个永无止境的纵横交错的情况下,一个值可能会一直翻转直到时间结束,而不会得到一个不干净的合并。这是一个非常基本的问题,要解决它首先需要确定在这种情况下想要发生什么,因为什么是适当的行为尚不清楚。
但是,这些问题都被模糊地表述了。递归 3 路合并中断的具体情况是什么,它以什么方式中断?
谁能展示一些它搞砸的版本控制历史?
(我不是在询问 diff 算法中的问题,例如理解源代码语义或冲突解决。假设用户很乐意解决冲突并使用简单的字符串 diff。)
【问题讨论】:
-
在实践中,我在其他地方看到的 3 路合并是,如果两个人添加例如将新代码添加到文件的不同部分,一切都很好,但是如果两个人都决定将他们的新代码粘贴到文件的底部,则合并无法判断您是否有两个不同的附加到文件末尾或两次相互竞争的尝试进行相同的更改,因此引发了冲突。因此,将新代码放在一个独特的地方是个好主意,而不仅仅是把它放在文件的底部。
-
@mcdowella 您正在描述 diff 算法的问题,这不是 3 路合并策略的问题。无论您使用哪种合并策略,都会发生两个人写入文件同一部分的问题。