使用git合并耐心策略的示例?

5

我找不到任何例子证明 --patience 和普通策略有不同的结果。

根据 这个 答案,如果我有这个文件:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

我是这样更新它的:

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}

根据我使用的算法,我应该能看到两个不同的差异。

但对我来说,这些命令的输出始终都是相同的。

git diff --diff-algorithm=patience
git diff

diff --git a/foo.bar b/foo.bar
index 453dcb1..42cd4b4 100644
--- a/foo.bar
+++ b/foo.bar
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
     margin: 0;
 }

-.bar {
+.foo1 {
     margin: 0;
+    color: green;
 }
\ No newline at end of file

我正在使用 git版本 2.14.2

3个回答

4

我认为--patience在以下情况下非常有用:当一系列函数已经存在并且需要在其中间添加一个新的函数时。

int foo(void)
{
  ...
}

int baz(void)
{
  ...
}

如果在两者之间添加int bar(),差异通常会看起来像这样:
+ }
+
+ int bar()
+ {
+    ...

这句话是正确的,但不太直观。

但是使用--patience参数后,你将得到预期的结果。

+ int bar()
+ {
+   ...
+ }
+

除了增加直观性,使用--patience参数还能增加可预测性。如果您正在进行元差异(diff of diffs):即将两组更改进行比较,以查看是否在两个地方都进行了相同的更改,则此功能非常有用。如果一个diff以一种方式计算括号,而另一个diff以另一种方式计算括号,那么您将错误地确定您的两组更改不等效。但是,如果您告诉git使用--patience,则可以获得一致格式的可预测性。(这不是理论,而是通过痛苦的经验学到的。)

1
“耐心”算法会在匹配剩余行之前删除重复的行。(这有些过于简化了——它会在差异子框中删除重复的行;在每次递归时,它会删除仅在子框内部重复的行,而不是整个文件。然而,在第一遍中,子框是“整个文件”。)
在您的示例中,有两行重复,即“margin: 0;”和“}”。因此,耐心差分子序列查找器的初始输入为:
.foo1 {

.bar {

对于左侧或“A”侧:

.bar {

.foo1 {
    color: green;

针对右侧或“B”侧。

空行匹配,.foo1 { 行匹配。但是它们的顺序不正确,而且只有一个元素长度,因此它们没有用处。

整个算法则回归到正常的差异比较,并且您会得到与正常差异比较相同的输出。

编辑:如何构建示例

构建输入以使算法产生不同结果并不容易。您需要拥有长的公共子序列,这些子序列在丢弃重复行后被找到,但在不这样做时却找不到。考虑编写类似以下内容的东西:

line 1
line 2
noise
noise
noise
noise
line 3
noise
noise
noise
line 4

作为输入的一部分(在差异的一个或两个“侧面”A和B上),然后仅对“非噪声”行进行更改。纯粹的git diff将同步noise行(在每个部分中使用不同数量的noise行),而耐心差异将舍弃它们。如果许多噪声行部分组成最长公共子序列的一部分,则普通差异将选择匹配它,然后递归查找匹配上方或下方的差异。当去噪版本具有不同的最长公共子序列时,耐心差异将匹配它们,并在(现在不同的)未匹配子序列上进行递归。


对于最小值和直方图,您有什么想法吗? - mleykamp
@mleykamp:minimal会删除使Myers更快的快捷方式。在我看来,它在实践中并不是真正有用的(很少有情况下会导致更短的差异,而更短的差异并不真正“更好”)。histogram类似于patience,但它是加权的,而不仅仅是排除重复行。它倾向于匹配非重复行。在Git-2.12之前的实现中存在一个错误。理论上它应该是最好的差异,但我还没有在很多输入上尝试过它。 - torek

0

提醒:自 Git 2.33.1(2021年第四季度)起,耐心合并策略已不再使用,取而代之的是默认合并策略 ORT ("显然递归的孪生")

请查看 提交 81483fe, 提交 67feccd, 提交 6320813, 提交 b36ade2, 提交 4d15c85, 提交 002a6df, 提交 510415e, 提交 e80178e, 提交 b378df7, 提交 e037c2e (2021年8月4日) 由 Elijah Newren (newren) 提交。
(由 Junio C Hamano -- gitster -- 合并于 提交 aca13c2, 2021年8月30日)

merge-strategies.txt:避免给予耐心算法特别偏好

Acked-by: Derrick Stolee
Acked-by: Johannes Schindelin
Signed-off-by: Elijah Newren

我们已经有了解释为什么存在特殊差异算法的diff-algorithm,因此我们不需要重新解释patience。
由于历史原因,耐心算法存在于其自己的顶级选项中,但是没有理由赋予它特别的偏爱或再次记录它并建议它比其他差异算法更重要,因此只需将其作为diff-algorithm=patience的弃用速记形式引用。

merge-strategies现在包含在其手册页面中:

已弃用的同义词,用于 diff-algorithm=patience

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接