git diff –patience是什么?

耐心algorithm与默认的git diffalgorithm有什么不同,我想在什么时候使用它?

你可以从耐心差异algorithm的作者Bram Cohen那里读到一篇文章 ,但是我发现这篇博客文章总结了耐心差异algorithm:

耐心差异,而是把精力集中在低频高内容线上,作为文本中重要内容的标记或签名。 它的核心仍然是基于LCS的差异,但有一个重要的区别,因为它只考虑签名线最长的共同子序列:

找出所有只发生一次的行,然后在这些行上做最长的公共子序列,将它们匹配起来。

什么时候应该使用耐心差异? 根据Bram的说法,耐心比较适合这种情况:

非常糟糕的情况是两个版本差异很大,开发人员不小心控制补丁大小。 在这种情况下,差异algorithm可能偶尔会变成“未alignment”,因为它将长括号的大括号匹配在一起,但是将一个版本中的函数的大括号与另一个版本中的下一个函数的大括号关联起来。 这种情况是非常丑陋的 ,并且可能会导致完全无法使用的冲突文件,在这种情况下,您需要将这些内容最一致地呈现出来。

你也可以使用它进行合并(在这里为一些XML冲突工作得很好):

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

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

假设你有以下文件签入git:

 .foo1 { margin: 0; } .bar { margin: 0; } 

现在我们对这些部分重新sorting并添加一行:

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

默认的差异algorithm声称部分标题已经改变:

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

请注意, 耐心差异algorithm仍然有一些已知的病理情况 。