2010-10-28 137 views
185

耐心算法与默认git diff算法有什么不同,以及我何时想使用它?git diff --patience是什么?

+0

也许它匹配移动代码和修改后的行可能会更慢 – codymanix 2010-10-28 16:32:24

+0

我已经提取了一个独立的脚本,用于来自Bazaar的Patience Diff,您可以在[另一个SO线程]中找到它(http://stackoverflow.com/questions/4599456 /文本方式-版本比较-JSON/4599500#4599500)。 – TryPyPy 2011-01-05 00:48:23

+28

后续问题。我何时不应该使用耐心差异? – balki 2012-11-29 15:32:08

回答

157

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

耐心差异,相反,集中它的能量在低频率高 - 作为文本中重要内容的标记或签名的内容行。它仍然是其核心基于LCS-DIFF,但有一个重要的区别,因为它仅考虑了签名行的最长公共子:

发现其两侧出现一次的所有行,然后做这些线上最长的公共子序列,将它们匹配起来。

当你应该使用耐心差异?据布拉姆,耐心DIFF有利于这种情况:

非常糟糕的情况是那些在两个版本的分歧 显着和开发商不小心让小片尺寸 在控制之下。在这些情况下,差异算法有时可能会由于它将大段大括号 放在一起而变得“未对齐”,但它将一个版本的 中的函数的大括号与下一个函数的大括号相关联 其他版本。这种情况是非常难看的,并且可能会导致完全不可用的冲突文件,在这种情况下,您最需要的是相干地提供的这样的内容。

+2

以我的经验现在使用XML,它给出的结果与普通diff差不多完全相同 – stivlo 2011-06-23 14:25:15

+5

对于使用XML的耐心差异,我已经有了更好的运气;当然,我目前看到的差异恰恰与上面描述的错位问题常规差异算法,但看起来绝对盛大耐心差异 – 2012-09-14 13:10:02

+14

这个博客有一个很好的解释,包括过程的动画gif:http://alfedenzo.livejournal.com/170301.html – Quantum7 2013-06-18 23:38:10

41

你也可以用它来合并(效果非常好这里的一些XML冲突):

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

看到,或者通过'git config --global diff.algorithm耐心' – Tobu 2013-04-11 07:50:01

+6

更短'git merge -X耐心' 。 – PythonNut 2015-07-15 21:34:00

21

耐心DIFF算法是一个缓慢的DIFF算法,显示在某些情况下,更好的结果。

假设你有以下文件签入到混帐:

.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。请注意0​​。