2

我正在尝试在基本版本 X 和两个不同的衍生版本 A 和 B 之间实现三向差异/合并算法(在 python 中),但我无法弄清楚如何处理一些更改。

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

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

但是,我正在为如何处理 a+和 a-或 a+和 a而苦苦挣扎c。例如,在第一种情况下,我在一侧添加了新行,并在另一侧删除了后续行。严格来说,我不认为这是一个冲突,但是如果添加依赖于那条线呢?我想这适用于整个事情(在一个地方添加的东西可能依赖于其他地方的东西才有意义)。第二种情况也是类似的,我一边加了一行,另一边改了一行,但是添加的可能是依赖原版的行。

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

4

1 回答 1

0

通常的稳健策略(diff3,git's resolve ...)是,一个文件中的更改(+ - c)必须远离另一个文件中竞争更改的最小 N(例如 3)个上下文行 - 除非完全相等。否则它与手动解决冲突。类似于补丁应用程序中一些干净上下文的要求。

这是一个示例,其中 sb 尝试了一些花哨的额外策略,例如“# 如果两个删除操作重叠,则合并它们的范围”以减少某些冲突。但那是有风险的;而另一方面,即使在很远的地方,也不能保证并发更改不会导致问题。

于 2020-10-15T19:27:26.603 回答