git diff --patience是什么意思?


219

耐心算法与默认git diff算法有何不同?我何时要使用它?


1
也许它与移动的代码和经过修改的行匹配,这可能会慢得多
codymanix 2010年

我从Bazaar提取了Patience Diff的独立脚本,您可以在另一个SO线程中找到它。
TryPyPy 2011年

38
后续问题。什么时候不应该使用耐心差异?
balki 2012年

4
还有一个--histogram参数“ ...扩展耐心算法以“支持低发生率的公共元素” git-scm.com/docs/git-diff.html
Robert

Answers:


183

您可以阅读耐心差异算法作者Bram Cohen的文章,但我发现此博客文章很好地总结了耐心差异算法:

相反,“耐心差异”将精力集中在低频高含量行上,这些行用作文本中重要内容的标记或签名。它的核心仍然是基于LCS的差异,但有一个重要区别,因为它仅考虑签名行的最长公共子序列:

找到在两侧恰好发生一次的所有行,然后在这些行上执行最长的公共子序列,使其匹配。

什么时候应该使用耐心差异?根据Bram的说法,耐心差异对这种情况有好处:

真正糟糕的情况是,两个版本的差异很大,开发人员并不小心控制补丁大小。在这种情况下,diff算法有时会变得“错位”,因为它会将大括号的花括号匹配在一起,但是最终将一个版本中的函数的花括号与另一版本中的下一个函数的花括号关联起来。这种情况非常丑陋,在您最需要最连贯呈现这种情况的情况下,可能会导致完全无法使用的冲突文件。


3
以我现在使用XML的经验来看,它给出的结果与普通diff完全相同。
stivlo 2011年

5
我对XML的耐心性有了更好的运气。当然,我正在查看的diff当前正好具有常规diff算法所描述的不对齐问题,但耐心diff看起来绝对不错。
me_and 2012年

22
这个博客有一个很好的解释,包括动画的gif效果:alfedenzo.livejournal.com/170301.html
Quantum7 2013年

3
我发现此博客非常有趣,并提供了很好的解释,并提供了指向算法详细信息的进一步链接:fabiensanglard.net/git_code_review/diff.php希望对某人有用
SathOkh 2014年


52

您还可以将其用于合并(对于某些XML冲突,在这里工作得很好):

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

51
或通过git config --global diff.algorithm patience
Tobu

11
短一点git merge -X patience
PythonNut

42

耐心差异算法是一种较慢的差异算法,在某些情况下显示出更好的结果。

假设您已在git中签入了以下文件:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

现在,我们对这些部分重新排序并添加新行:

.bar {
    margin: 0;
}

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

默认的diff算法声称该节的标题已更改:

$ 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;
 }

而耐心差异显示的结果可以说更直观:

$ 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正在进一步探索差异启发式

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.