有没有使用git合并策略的例子?

有没有使用git合并策略的例子?,git,diff,git-merge,git-diff,Git,Diff,Git Merge,Git Diff,我找不到任何真正的例子,说明--patience给出的结果与正常策略不同 根据答案,如果我有此文件: .foo1 { margin: 0; } .bar { margin: 0; } 我用这种方式更新它: .bar { margin: 0; } .foo1 { margin: 0; color: green; } 我应该看到两种不同的差异取决于我使用的算法 但对我来说,这些命令的输出总是一样的 git diff --diff-algorithm=p

我找不到任何真正的例子,说明
--patience
给出的结果与正常策略不同

根据答案,如果我有此文件:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}
我用这种方式更新它:

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}
我应该看到两种不同的差异取决于我使用的算法

但对我来说,这些命令的输出总是一样的

git diff --diff-algorithm=patience
git diff

我使用的是GitVersion2.14.2

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

在您的示例中,有两行重复,即
margin:0
}
。因此,patience diff子序列查找器的初始输入为:

.foo1 {

.bar {
对于左侧或“A”侧,以及:

.bar {

.foo1 {
    color: green;
用于右侧或“B”侧

空行匹配,以及
.foo1{
行匹配。但是这些都不符合顺序,而且只包含一个元素,因此它们没有用处

算法作为一个整体,然后回落到正常差异,您得到的输出与正常差异相同

编辑:如何构造示例 构造输入的算法并不容易,不同的结果是,你需要的是在丢弃重复行之后发现的长的公共子序列,但是没有这样做就找不到。
line 1
line 2
noise
noise
noise
noise
line 3
noise
noise
noise
line 4
作为输入的一部分(在差异的一侧或两侧,A和B),然后仅在“非噪声”行中进行更改。普通
git diff
将在
噪声
行上同步(在每个部分中使用不同数量的
噪声
行),而patience diff将丢弃它们。如果许多噪波线部分中的一个组成了最长公共子序列的一部分,则普通diff将选择匹配该部分,然后递归以查找匹配上方或下方部分中的差异。当消噪版本具有不同的最长公共子序列时,patience diff将将这些匹配起来,然后在(现在不同的)不匹配的子序列上进行递归。

我看到<代码> -耐心<代码>在有一系列函数的情况下是有用的,在中间添加了一个新函数。

int foo(void)
{
  ...
}

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

+ }
+
+ int bar()
+ {
+    ...
这是正确的,但不直观

但是有了耐心,你就能得到预期的结果

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

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

关于最小值和直方图有什么想法吗?@mleykamp:
minimal
删除了使Myers更快的捷径。在我看来,它在实践中并没有真正的用处(在少数情况下,它会导致较短的差异,而较短的差异并不是真正的“更好”).
histogram
patience
类似,不同之处在于它是加权的,而不仅仅是排除重复行。它偏向于匹配非重复行。在Git-2.12之前的实现中有一个缺陷。理论上它现在应该是最好的差异,但我没有在很多输入上尝试过。
+ int bar()
+ {
+   ...
+ }
+