Git - diff3 Conflict Style - 临时 merge 分支

标签 git merge git-merge diff3

我正在将 merge.conflictStyle 设置为 diff3 进行 merge 。通常,这会插入由四 (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.

但是,我得到了一个更复杂的结果,其中包含许多额外的行(见下文)。我有一种感觉,这与我在当前正在 merge 的提交的祖先中进行了大量 merge 有关,但我无法弄清楚额外的行是什么意思。我似乎也找不到有关此行为的任何文档。

这是我得到的(当然是编辑过的,以保护代码的身份)。

(我尝试 merge 的任何提交的代码中都没有冲突标记,所以这不是答案。)

<<<<<<< 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 有关的任何其他内容,提问者已经在标题中指出他/她熟悉的东西。我试过两次编辑那个问题,但都被拒绝了,所以我再问一次。

最佳答案

这里的内容(使用 Temporary merge branch 1 和 2 相同)是由于 git 的“递归 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 行左右)。当提交图有多个候选 merge 基础时,Git 将执行递归 merge (更多信息请参见 this blog post)。为了(过度?)简化一点,git 进行了内部递归 merge ,产生了 merge 冲突,然后进行了外部 merge 并遇到了另一个 merge 冲突。您看到的是外部 merge 冲突(我们的 vs 他们的),内部冲突显示为“基本”版本。

您可能会发现,通过选择其他一些 merge 策略或使用替代差异算法(patienceminimalhistogram 算法与默认的 myers)。或者,您可能想暂时禁用 diff3 样式,这样您就不会看到内部 merge 。

关于Git - diff3 Conflict Style - 临时 merge 分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392513/

相关文章:

java - 如何针对 "pull --rebase"冲突重新启动 merge

node.js - 跟踪程序中的内部版本号和版本

javascript - 在 Angular Javascript 中合并数组并组合匹配对象

git - 如何在 Git 中获取 merge 提交的父项?

git - 了解 Git 图

git - Git 软件(例如 Gitbox、Github、SourceTree)可以使用远程仓库而不是本地仓库吗?

git - 如何撤消未提交更改的 git checkout 文件?

TortoiseSVN 修订图 : Merge -> line connected back to trunk?

Git 保持一些本地更改干净但不推送它们

git - 让 git 只是*复制*(而不是 merge )?