什么是`git diff --patience`?

Gab*_*art 211 git diff

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

Mar*_*off 175

你可以阅读耐心差异算法的作者Bram Cohen的帖子,但我发现这篇博文很好地总结了耐心差异算法:

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

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

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

真正糟糕的情况是两个版本发生了巨大分歧并且开发人员不小心控制补丁大小.在这种情况下,diff算法有时可能会变得"错位",因为它将大括号的大部分匹配在一起,但它最终将一个版本中函数的大括号与另一个版本中下一个函数的大括号相关联.这种情况非常难看,并且在您需要最大限度地呈现这些内容的情况下,可能会导致完全无法使用的冲突文件.

  • 这个博客有一个很好的解释,包括一个过程的动画GIF:http://alfedenzo.livejournal.com/170301.html (18认同)
  • 我有更好的运气与XML的耐心差异; 当然,我正在看的差异正好具有常规差异算法所描述的错位问题,但看起来非常有耐心差异. (5认同)
  • 根据我目前使用XML的经验,它提供与普通差异完全相同的"坏"结果. (3认同)
  • 我发现这个博客非常有趣,并提供了很好的解释与进一步的算法细节链接:http://fabiensanglard.net/git_code_review/diff.php希望它对某人有用 (3认同)

rob*_*nst 50

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

git merge --strategy-option=patience ...
Run Code Online (Sandbox Code Playgroud)

  • 或者通过`git config --global diff.algorithm耐心` (50认同)
  • 更短的将是'git merge -X耐心'. (9认同)

Wil*_*hes 40

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

假设您已将以下文件签入git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}
Run Code Online (Sandbox Code Playgroud)

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

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}
Run Code Online (Sandbox Code Playgroud)

默认的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;
 }
Run Code Online (Sandbox Code Playgroud)

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

$ 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;
+}
Run Code Online (Sandbox Code Playgroud)

这里有一个很好的讨论主观差异质量,git 2.11正在进一步探索差异启发式.

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