耐心算法与默认的 git diff
算法有何区别,以及什么情况下我会想要使用它?
何时应该使用 patience diff?根据 Bram 的说法,patience diff 对于以下情况比较好:相反,Patience Diff 专注于低频高内容行,它们在文本中充当标记或重要内容的签名。它仍然是一种基于 LCS 的差异,但有一个重要的区别,因为它仅考虑签名行的最长公共子序列:
找到两侧恰好出现一次的所有行,然后在这些行上执行最长公共子序列,将它们匹配起来。
真正糟糕的情况是两个版本分歧巨大,开发者没有注意控制补丁大小。在这种情况下,差异算法偶尔会“错位”,即将大段花括号匹配在一起,但它最终会将一个版本中函数的花括号与另一个版本中后面函数的花括号相对应。这种情况非常丑陋,可能导致完全无法使用的冲突文件,在你最需要呈现连贯性的情况下。
您还可以将其用于合并操作(在某些XML冲突情况下非常有效):
git merge --strategy-option=patience ...
git config --global diff.algorithm patience
命令配置 Git 的差异算法为 patience。 - Tobugit merge -X patience
。 - PythonNutpatience diff算法是一种较慢的diff算法,但在某些情况下会产生更好的结果。
假设您已将以下文件提交到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;
}
相比之下,patience diff 显示的结果可能更加直观:
$ 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正在进一步探索差异启发式算法。
请注意,耐心差异算法仍然存在一些已知的病理情况。
--histogram
参数,它“扩展了耐心算法以支持出现次数较低的常见元素”。http://git-scm.com/docs/git-diff.html - Robert