有没有使用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()
+ {
+ ...
+ }
+