Ign*_*ioC 5 git diff git-diff git-merge
我找不到任何真实的例子来--patience给出与正常策略不同的结果。
根据这个答案,如果我有这个文件:
.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)
我应该看到两个不同的差异取决于我使用的算法。
但对我来说这些命令的输出总是相同的
git diff --diff-algorithm=patience
git diff
Run Code Online (Sandbox Code Playgroud)
diff --git a/foo.bar b/foo.bar
index 453dcb1..42cd4b4 100644
--- a/foo.bar
+++ b/foo.bar
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
margin: 0;
}
-.bar {
+.foo1 {
margin: 0;
+ color: green;
}
\ No newline at end of file
Run Code Online (Sandbox Code Playgroud)
我在用着git version 2.14.2
“耐心”算法会在匹配剩余的行之前丢弃重复的行。(这有点过于简单化了\xe2\x80\x94它会抛出不同的子框中的重复行;在每次递归时,它都会抛出仅在子框中重复的行,而不是在整个文件中重复的行.不过,对于第一遍,子框是“整个文件”。)
\n\n在您的示例中,有两行重复,即margin: 0;和}。因此,耐心差异子序列查找器的初始输入是:
.foo1 {\n\n.bar {\nRun Code Online (Sandbox Code Playgroud)\n\n对于左侧或“A”侧以及:
\n\n.bar {\n\n.foo1 {\n color: green;\nRun Code Online (Sandbox Code Playgroud)\n\n对于右侧或“B”侧。
\n\n空行匹配,行.foo1 {匹配。但这些不是按顺序排列的,而且只有一个元素长,所以它们没有用。
然后,整个算法会回到正常 diff,并且您会得到与正常 diff 相同的输出。
\n\n构建算法给出不同结果的输入并不容易。您需要的是在丢弃重复行后找到很长的公共子序列,但如果不这样做就找不到它们。考虑写一些类似的东西:
\n\nline 1\nline 2\nnoise\nnoise\nnoise\nnoise\nline 3\nnoise\nnoise\nnoise\nline 4\nRun Code Online (Sandbox Code Playgroud)\n\n作为输入的一部分(在差异的一侧或两侧,A 和 B),然后仅在“非噪声”行中进行更改。Plaingit diff将在行上同步noise(在每个部分中使用不同数量的noise行),而耐心 diff 将丢弃它们。如果许多噪声线部分之一构成最长公共子序列的一部分,则普通 diff 将选择将其匹配,然后递归以查找匹配上方或下方的部分内的差异。当去噪版本具有不同的最长公共子序列时,patience diff 将匹配它们,并在(现在不同的)不匹配的子序列上递归。