git-merge-base返回只有一个提交记录。

3

当我在分支之间进行合并时,git会进行递归合并,并在冲突处插入<<<<<<< Temporary merge branch x代码块。

我取消了合并操作,然后执行git merge-base <source-commit> <target-commit>,但它只返回一个SHA1值。

是否有可能找出多个基础提交的内容?

2个回答

4
你需要使用--all选项来运行git-merge-base。根据文档描述:
-a, --all
    Output all merge bases for the commits, instead of just one.

这将显示所有合并基础,用于创建一个临时树作为递归合并基础。

例如,考虑一些交叉合并的分支“A”和“B”:

       3a4f5a6 -- 973b703 -- a34e5a1 (branch A)
      /        \ /
7c7bf85         X
      \        / \
       8f35f30 -- 3fd4180 -- 723181f (branch B)

很明显,分支A和B有两个共同的祖先,它们参与了一次交错合并:3a3f5a68f35f30。使用--all标志,git-merge-base 会选择其中一个共同祖先作为合并基础,但使用该标志将包括两个共同祖先:

% git-merge-base A B
3a3f5a6ec1c968d1d2d5d20dee0d161a4351f279
% git-merge-base --all A B
3a3f5a6ec1c968d1d2d5d20dee0d161a4351f279
8f35f30bfe09513f96cf8aa4df0834ae34e93bae

在这种情况下,正如您所指出的那样,git-merge-recursive会将两个合并基础合并成一个虚拟提交,该提交将被用作三方合并算法的实际公共祖先。

太好了,我在文档中没有看到这个,我会试一下的。在你的评论中,似乎你说973b703和3fd4180是共同祖先。难道它们不是3a4f5a6和8f35f30吗? - Lee
哈哈,是的,请原谅我。我的写作有误,显然我无法读取图表或下面工具的输出。已经修改。 - Edward Thomson
2
在理想情况下,所有的合并基都具有相同的树形结构,并且中间合并产物与其任何输入相同。但实际上偶尔会出现不同的情况,正如您(OP)所发现的那样! :-) 另外需要注意的是,之前我检查了合并递归的代码:如果有三个或更多的合并基,则该过程实际上是在这些基础上进行迭代的。也就是说,首先获取“--all”列表,然后将其中的前两个合并,然后将每个额外的条目重复合并到合并结果中。 - torek
没错,而且......当合并您的合并基时,它们可能已经交叉合并了。因此,您的合并基可能需要一个虚拟合并基......这是递归合并一直到底部。 :) - Edward Thomson

0

关于如何使用特定的基础重新合并一个特定文件的说明,请参见此答案,以回答您相关的问题。【历史注:楼主删除了该问题,但现在已经恢复;我在这里有答案,但它属于那里;因此出现了所有这些链接…】


感谢您的时间,我已经恢复了您所提到的问题,并且您可以自由地将此答案移动过去 :) http://stackoverflow.com/questions/37049055/git-choose-simpler-base-in-recursive-merge - Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接