2016-05-05 80 views
3

当我在分支之间合并时,git执行递归合并冲突,将<<<<<<< Temporary merge branch x块放入。git-merge-base只返回一个提交

我放弃合并,然后做git merge-base <source-commit> <target-commit>,但它只返回一个SHA1。

是否有可能找出多个基础提交是什么?

回答

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具有参与纵横交错两个共同祖先合并:3a3f5a68f35f30git-merge-base会选择共同祖先作为合并基础的一个,但使用--all标志将包括:

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

在这种情况下,当你注意,git-merge-recursive将合并两个合并基础创建一个虚拟提交将被用作三路合并算法的实际共同祖先。

+0

完美,我错过了看到在文档中,我会给它一个去。在你的评论中,似乎你说973b703和3fd4180是共同的祖先。他们不是3a4f5a6和8f35f30吗? – Lee

+0

哈,是的,请原谅我。我的写作是不正确的,我显然无法阅读下面的图表*或*工具的输出。编辑。 –

+2

在理想情况下,所有合并基地具有相同的树,中间合并产品与其任何投入相同。在实践中,偶尔不会像你(OP)发现的那样! :-)另一个说明,后来我检查了merge-recursive的代码:如果有三个或更多的合并基础,这个过程实际上是在这些基础上迭代的。也就是说,合并首先获取'--all'列表,然后合并其中的前两个,然后将每个附加条目重复合并到合并结果中。 – torek

0

有关如何使用一个特定基准重新合并一个特定文件的说明,请参阅this answeryour related question。 [历史记录:OP删除了这个问题,但现在已经复活了;我在这里得到了答案,但它属于那里;因此所有这些链接....]

+0

感谢您的时间,我已经取消删除您指的问题,随时移动此答案:) http://stackoverflow.com/questions/37049055/git-choose-simpler-base-in -recursive合并 – Lee