Git - diff3 冲突风格 - 临时合并分支
Git - diff3 Conflict Style - Temporary merge branch
我正在合并 merge.conflictStyle
设置为 diff3
。通常,这会插入由四 (4) 组字符分隔的三 (3) 个部分。
Git Documentation for Merge 清楚地解释了这些符号在简单情况下的含义(如下所述)。
常规 diff3:
Here are lines that are either unchanged from the common ancestor, or cleanly resolved because only one side changed.
<<<<<<< yours:sample.txt
Conflict resolution is hard;
let's go shopping.
|||||||
Conflict resolution is hard.
=======
Git makes conflict resolution easy.
>>>>>>> theirs:sample.txt
And here is another line that is cleanly resolved or unmodified.
但是,我得到了一个更复杂的结果,其中包含许多额外的行(见下文)。我有一种感觉,这与我在当前正在合并的提交的祖先中进行了大量合并有关,但我无法弄清楚额外的行是什么意思。我似乎也找不到有关此行为的任何文档。
这是我得到的(当然是编辑过的,以保护代码的身份)。
(我尝试合并的任何提交的代码中都没有冲突标记,所以这不是答案。)
<<<<<<< ours
||||||| base
<<<<<<< Temporary merge branch 1
||||||| merged common ancestors
if (sendRedirect(result))
return new Result("redirect");
=======
if ( result.getId() != null )
{
object = new SomeObject(searchResult.getId()) ;
}
if (sendRedirect(result)){
return new Result("redirect");
}
>>>>>>> Temporary merge branch 2
=======
if ( result.getId() != null )
{
object = new SomeObject(searchResult.getId()) ;
}
>>>>>>> theirs
我相信this question在问同样的事情,但答案并没有解释它与diff3有关的任何其他内容,发问者已经在标题中指出它是[=33] =] 熟悉。我试过两次编辑那个问题,但都被拒绝了,所以我再问一次。
这里的内容(Temporary merge branch 1
与 2 相同)是由于 git 的 "recursive merge" 方法:
o->branch1 = "Temporary merge branch 1";
o->branch2 = "Temporary merge branch 2";
merge_recursive(o, merged_common_ancestors, iter->item,
NULL, &merged_common_ancestors);
(merge-recursive.c
,1940 行左右)。 Git 将在提交图有多个合并基础候选者时进行递归合并(有关更多信息,请参见 this blog post)。为了(过度?)简化一点,git 进行了内部递归合并,产生了合并冲突,然后进行了外部合并并遇到了另一个合并冲突。您看到的是外部合并冲突(ours
vs theirs
),内部冲突显示为 "base" 版本。
您可能会发现,通过选择其他一些合并策略或使用替代差异算法(patience
、minimal
和 histogram
算法与默认算法相比,您可以获得更好的结果myers
)。或者,您可能想稍微禁用 diff3
样式,这样您就不会 看到 内部合并。
我正在合并 merge.conflictStyle
设置为 diff3
。通常,这会插入由四 (4) 组字符分隔的三 (3) 个部分。
Git Documentation for Merge 清楚地解释了这些符号在简单情况下的含义(如下所述)。
常规 diff3:
Here are lines that are either unchanged from the common ancestor, or cleanly resolved because only one side changed.
<<<<<<< yours:sample.txt
Conflict resolution is hard;
let's go shopping.
|||||||
Conflict resolution is hard.
=======
Git makes conflict resolution easy.
>>>>>>> theirs:sample.txt
And here is another line that is cleanly resolved or unmodified.
但是,我得到了一个更复杂的结果,其中包含许多额外的行(见下文)。我有一种感觉,这与我在当前正在合并的提交的祖先中进行了大量合并有关,但我无法弄清楚额外的行是什么意思。我似乎也找不到有关此行为的任何文档。
这是我得到的(当然是编辑过的,以保护代码的身份)。
(我尝试合并的任何提交的代码中都没有冲突标记,所以这不是答案。)
<<<<<<< ours
||||||| base
<<<<<<< Temporary merge branch 1
||||||| merged common ancestors
if (sendRedirect(result))
return new Result("redirect");
=======
if ( result.getId() != null )
{
object = new SomeObject(searchResult.getId()) ;
}
if (sendRedirect(result)){
return new Result("redirect");
}
>>>>>>> Temporary merge branch 2
=======
if ( result.getId() != null )
{
object = new SomeObject(searchResult.getId()) ;
}
>>>>>>> theirs
我相信this question在问同样的事情,但答案并没有解释它与diff3有关的任何其他内容,发问者已经在标题中指出它是[=33] =] 熟悉。我试过两次编辑那个问题,但都被拒绝了,所以我再问一次。
这里的内容(Temporary merge branch 1
与 2 相同)是由于 git 的 "recursive merge" 方法:
o->branch1 = "Temporary merge branch 1";
o->branch2 = "Temporary merge branch 2";
merge_recursive(o, merged_common_ancestors, iter->item,
NULL, &merged_common_ancestors);
(merge-recursive.c
,1940 行左右)。 Git 将在提交图有多个合并基础候选者时进行递归合并(有关更多信息,请参见 this blog post)。为了(过度?)简化一点,git 进行了内部递归合并,产生了合并冲突,然后进行了外部合并并遇到了另一个合并冲突。您看到的是外部合并冲突(ours
vs theirs
),内部冲突显示为 "base" 版本。
您可能会发现,通过选择其他一些合并策略或使用替代差异算法(patience
、minimal
和 histogram
算法与默认算法相比,您可以获得更好的结果myers
)。或者,您可能想稍微禁用 diff3
样式,这样您就不会 看到 内部合并。