实现三向差异/合并

时间:2014-09-18 18:11:17

标签: merge diff three-way-merge

我试图在基础版本X和两个不同的衍生版本A和B之间实现三向差异/合并算法(在python中),并且我很难搞清楚如何处理一些变化。

我有一个从X到A,从X到B的逐行差异。这些差异为每一行提供了一个"操作码"这是=,如果该行没有改变,+如果添加了一行,-如果该行被删除,c如果该行已更改(只是-后紧跟+,表示已删除一行,然后替换,有效修改。

现在我比较来自A-diff和B-diff的相应操作码,以尝试决定如何合并它们。其中一些操作码组合很简单:==表示版本都没有更改该行,因此我们保留原始版本。 +=表示在一侧添加了一条线而另一侧没有进行任何更改,因此接受添加并仅在添加该线的一侧前进到下一行。 -c是用户必须解决的冲突,因为一行更改了一行,另一行则删除了同一行。

但是,我正在努力解决如何使用+-,或+c。例如,在第一种情况下,我在一侧添加了一个新行,并删除了另一侧的后续行。严格来说,我并不认为这是一场冲突,但如果加入依赖于那条线路呢?我想这适用于整个事物(在一个地方添加的东西可能依赖于其他地方的东西才有意义)。第二种情况类似,我在一侧添加了一行,而在另一侧我更改了后续行,但添加可能依赖于该行的原始版本。

处理此问题的正常方法是什么?

1 个答案:

答案 0 :(得分:0)

通常的鲁棒策略(diff3,git的解决方案...)是,一个文件中的更改(+-c)必须与另一个文件中的竞争更改相距至少N(例如3)条上下文行-除非准确等于。否则,将导致手动解决冲突。类似于修补程序应用程序中某些干净上下文的要求。

这里是一个example,其中sb尝试了一些奇特的额外策略,例如“#如果两个Delete动作重叠,则取其范围的并集” 以减少某些冲突。但是那很冒险;另一方面,我们不能保证即使很远,并发更改也不会导致问题。