有使用 git merge 耐心策略的例子吗?

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

tor*_*rek 1

“耐心”算法会在匹配剩余的行之前丢弃重复的行。(这有点过于简单化了\xe2\x80\x94它会抛出不同的子框中的重复行;在每次递归时,它都会抛出仅在子框中重复的行,而不是在整个文件中重复的行.不过,对于第一遍,子框是“整个文件”。)

\n\n

在您的示例中,有两行重复,即margin: 0;}。因此,耐心差异子序列查找器的初始输入是:

\n\n
.foo1 {\n\n.bar {\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于左侧或“A”侧以及:

\n\n
.bar {\n\n.foo1 {\n    color: green;\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于右侧或“B”侧。

\n\n

空行匹配,行.foo1 {匹配。但这些不是按顺序排列的,而且只有一个元素长,所以它们没有用。

\n\n

然后,整个算法会回到正常 diff,并且您会得到与正常 diff 相同的输出。

\n\n

编辑:如何构建示例

\n\n

构建算法给出不同结果的输入并不容易。您需要的是在丢弃重复行后找到很长的公共子序列,但如果这样做就找不到它们。考虑写一些类似的东西:

\n\n
line 1\nline 2\nnoise\nnoise\nnoise\nnoise\nline 3\nnoise\nnoise\nnoise\nline 4\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为输入的一部分(在差异的一侧或两侧,A 和 B),然后仅在“非噪声”行中进行更改。Plaingit diff将在行上同步noise(在每个部分中使用不同数量的noise行),而耐心 diff 将丢弃它们。如果许多噪声线部分之一构成最长公共子序列的一部分,则普通 diff 将选择将其匹配,然后递归以查找匹配上方或下方的部分内的差异。当去噪版本具有不同的最长公共子序列时,patience diff 将匹配它们,并在(现在不同的)不匹配的子序列上递归。

\n