什么是`git diff --patience`?

时间:2010-10-28 16:26:51

标签: git diff

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

3 个答案:

答案 0 :(得分:171)

你可以阅读耐心差异算法的作者a post from Bram Cohen,但我发现this blog post非常好地总结了耐心差异算法:

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

     
    

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

  

你何时应该使用耐心差异?根据布拉姆的说法,耐心差异对这种情况有好处:

  

真正糟糕的情况是两个版本分歧的情况   显着而且开发人员不小心保持补丁大小   控制下。在这种情况下,偶尔可以使用diff算法   变得“错位”,因为它匹配大括号的长段   在一起,但它最终关联函数的大括号   一个版本,带有下一个后续函数的大括号   其他版本。这种情况非常难看,并且可能导致完全   在您需要这样的事情的情况下不可用的冲突文件   最连贯地呈现出来。

答案 1 :(得分:49)

您也可以将它用于合并(在某些XML冲突中非常有用):

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

答案 2 :(得分:30)

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

假设您已将以下文件签入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;
 }

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

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

a good discussion of subjective diff quality heregit 2.11 is exploring diff heuristics further

请注意patience diff algorithm still has some known pathological cases