使用--squash将git合并后的分支进行比较

时间:2014-09-24 06:39:34

标签: git git-merge git-squash

我有一个带有子分支B的父分支A.在分支B中,我有两个单独的提交。我将A中的分支B合并为像这样的壁球

git merge --squash B 

当我将分支A与分支B进行比较时:

git log A..B

它显示来自分支B的两个提交都是未合并的。我如何将它与父分支A的压缩提交进行比较?这样两个分支之间的响应没有区别

由于

1 个答案:

答案 0 :(得分:3)

引用git merge documentation--squash表示:

  

生成工作树和索引状态,就像发生了真正的合并一样(合并信息除外),但实际上没有提交或移动HEAD,也没有记录$GIT_DIR/MERGE_HEAD导致next git commit命令用于创建合并提交。这允许您在当前分支之上创建单个提交,其效果与合并另一个分支相同(或者在章鱼的情况下更多)。

换句话说,在你git commit结果之后,你只有一个普通的提交,而不是一个合并提交。与此普通提交相关联的 - 如果您将其签出,则在工作目录中获得的内容与您通过合并获得的树匹配,但不会记录实际的合并。

根据您描述的设置,您在运行git merge --squash B

之前已经这样做了
...- o         <-- A
      \
       o - o   <-- B

作为提交图。在git checkout A; git merge --squash B; git commit -m squash-B之后你现在拥有:

...- o ----- *   <-- HEAD=A
      \
       o - o     <-- B

请注意,最新提交*与仅在分支B上的两个提交之一之间没有提交图连接。提交*与通过常规合并获得的相同,但提交图是不同的:真正的合并将如下所示:

...- o ----- *
      \     /
       o - o

(我在这里省略了分支标签,以强调这不是你实际拥有的)。


点 - 点符号A..B要求“可以从B到达的提交,减去可从A到达的提交”。图表看起来像这样(与上面的几个相同,为了清楚起见,这里重复一遍):

...- o ----- *   <-- HEAD=A
      \
       o - o     <-- B

下部的两个o提交可以从B以及上部o和任何早期的提交到达;但是从o开始,可以从标记为A的提交开始并向后工作,从*和任何早期提交可以到达,因此这些提交被排除在外。这只留下了两个o提交:分支B顶端的提交和前一个提交。

请注意,如果您进行了真正的合并,A..B将为空,因为从分支B的提示可以到达的所有提交也可以从分支A的提示处获得。 (而且,相比之下,B..A只是提交*,因为该提交可以从A但不能从B到达;但是对于无实际情况,这是正确的 - 仅限南瓜历史。)