任何使用git merge耐心策略的例子?

时间:2017-11-06 21:47:14

标签: git diff git-merge git-diff

我找不到--patience给出与正常策略不同的结果的任何真实示例。

根据this回答,如果我有这个文件:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

我以这种方式更新它:

.bar {
    margin: 0;
}

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

我应该看到两种不同的差异取决于我使用的算法。

但对我来说,这些命令的输出始终是相同的

git diff --diff-algorithm=patience
git diff
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

我正在使用git version 2.14.2

2 个答案:

答案 0 :(得分:2)

我看到--patience在有一系列功能并且中间添加了一个新功能的情况下一直很有用。

int foo(void)
{
  ...
}

int baz(void)
{
  ...
}

如果在两者之间添加int bar(),则差异通常如下所示:

+ }
+
+ int bar()
+ {
+    ...

哪个是正确的,但不直观。

但是--patience可以得到预期的

+ int bar()
+ {
+   ...
+ }
+

除了增加一定程度的直观性外,它还增加了可预测性。如果您正在进行元差异(diff差异),这可能很有用:进行两组更改并比较它们以查看是否在两个位置都进行了相同的更改。如果一个差异以一种方式计算包围而另一个以另一种方式计算包围,则您将错误地确定您的两组更改不相等。但是如果你告诉git使用--patience,你就可以获得一致格式的可预测性。 (这不是理论上的,而是通过痛苦的经历来学习。)

答案 1 :(得分:1)

"耐心"算法会在匹配其余行之前抛出重复的行。 (这有点过于简单 - 它会在子框中抛出重复的行它的差异;在每次递归时,它会抛出在子框内重复的行,而不是整个文件。但是,对于第一遍,子框是"整个文件"。)

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

.foo1 {

.bar {

表示左侧或" A"方和:

.bar {

.foo1 {
    color: green;

代表权利或" B"侧。

空行匹配,.foo1 {行匹配。但这些都不合适,而且只有一个元素长,所以它们没用。

整个算法然后回退到普通差异,你获得与普通差异相同的输出。

编辑:如何构建示例

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

line 1
line 2
noise
noise
noise
noise
line 3
noise
noise
noise
line 4

作为输入的一部分(在差异的一个或两个"边和#34;,A和B),然后仅在"非噪声"中进行更改。线。简单git diff将在noise行上同步(在每个部分中使用不同数量的noise行),而耐心差异会将它们抛弃。如果许多噪声线部分中的一个构成最长公共子序列的一部分,则普通差异将选择与其匹配,然后递归以找到匹配上方或下方的部分内的差异。当降噪版本具有不同的最长公共子序列时,耐心差异将匹配那些,并递归(现在不同的)不匹配的子序列。