`git diff --patience` 是用来做什么的?

234

耐心算法与默认的 git diff 算法有何区别,以及什么情况下我会想要使用它?


1
也许它匹配移动的代码和修改的行,这可能会慢得多。 - codymanix
我从Bazaar中提取了一个独立的Patience Diff脚本,你可以在另一个SO线程中找到它。 - TryPyPy
43
跟进问题。什么情况下我不应该使用patience diff? - balki
5
还有一个 --histogram 参数,它“扩展了耐心算法以支持出现次数较低的常见元素”。http://git-scm.com/docs/git-diff.html - Robert
3个回答

193
你可以阅读 patience diff 算法的作者 Bram Cohen 的 一篇文章,但我发现 这篇博客文章 很好地总结了 patience diff 算法:

相反,Patience Diff 专注于低频高内容行,它们在文本中充当标记或重要内容的签名。它仍然是一种基于 LCS 的差异,但有一个重要的区别,因为它仅考虑签名行的最长公共子序列:

找到两侧恰好出现一次的所有行,然后在这些行上执行最长公共子序列,将它们匹配起来。

何时应该使用 patience diff?根据 Bram 的说法,patience diff 对于以下情况比较好:

真正糟糕的情况是两个版本分歧巨大,开发者没有注意控制补丁大小。在这种情况下,差异算法偶尔会“错位”,即将大段花括号匹配在一起,但它最终会将一个版本中函数的花括号与另一个版本中后面函数的花括号相对应。这种情况非常丑陋,可能导致完全无法使用的冲突文件,在你最需要呈现连贯性的情况下。


3
就我目前使用XML的经验来看,它给出的“不好”的结果与普通的差异比较一模一样。 - stivlo
5
我在使用patience diff比XML更好用;当前我正在查看的diff正面临着常规diff算法所描述的错位问题,但是使用patience diff却非常好。 - me_and
22
这篇博客有很好的解释,还包括了一个过程的动态图:http://alfedenzo.livejournal.com/170301.html - Quantum7
3
我觉得这个博客非常有趣,提供了良好的解释和指向算法细节的链接:http://fabiensanglard.net/git_code_review/diff.php 希望对某些人有用。 - SathOkh
Frobnitz/fib/fact的差异可以在https://gist.github.com/roryokane/6f9061d3a60c1ba41237中看到。 - George V. Reilly

55

您还可以将其用于合并操作(在某些XML冲突情况下非常有效):

git merge --strategy-option=patience ...

55
可以通过 git config --global diff.algorithm patience 命令配置 Git 的差异算法为 patience。 - Tobu
12
较短的命令是 git merge -X patience - PythonNut

53

patience diff算法是一种较慢的diff算法,但在某些情况下会产生更好的结果。

假设您已将以下文件提交到git中:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

现在我们重新排序各个部分,并添加一行新代码:

.bar {
    margin: 0;
}

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

默认的差异算法显示章节标题已更改:

$ git diff --diff-algorithm=myers   
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
     margin: 0;
 }

-.bar {
+.foo1 {
     margin: 0;
+    color: green;
 }

相比之下,patience diff 显示的结果可能更加直观:

$ git diff --diff-algorithm=patience
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
-    margin: 0;
-}
-
 .bar {
     margin: 0;
 }
+
+.foo1 {
+    margin: 0;
+    color: green;
+}

这里有一个关于主观差异质量的良好讨论,而git 2.11正在进一步探索差异启发式算法

请注意,耐心差异算法仍然存在一些已知的病理情况


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