git与--squash合并后比较分支

Ari*_*rif 3 git git-merge git-squash

我有一个父分支A和一个子分支B。在分支B中,我有两个单独的提交。我像这样将南瓜中的B分支合并到A中

git merge --squash B 
Run Code Online (Sandbox Code Playgroud)

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

git log A..B
Run Code Online (Sandbox Code Playgroud)

它显示了来自分支B的两个提交都未合并。我如何将其与父分支A的压缩提交进行比较?这样两个分支之间的响应就不会有差异

谢谢

tor*_*rek 5

引用git merge文档--squash意味着:

产生工作树和索引状态,就好像发生真正的合并一样(合并信息除外),但实际上不进行提交或移动HEAD,也不记录$GIT_DIR/MERGE_HEAD导致下一个git commit命令创建合并提交。这使您可以在当前分支的顶部创建一个提交,其作用与合并另一个分支的作用相同(对于章鱼,则更多)。

换句话说,git commit获得结果之后,您只有一个普通提交,而不是合并提交。与此普通提交关联的(如果签出,您将进入工作目录)与通过合并获得的树匹配,但未记录任何实际的合并。

给定您描述的设置,在运行之前已具备以下条件git merge --squash B

...- o         <-- A
      \
       o - o   <-- B
Run Code Online (Sandbox Code Playgroud)

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

...- o ----- *   <-- HEAD=A
      \
       o - o     <-- B
Run Code Online (Sandbox Code Playgroud)

请注意,最新提交*与仅位于branch上的两个提交之间没有提交图连接B。提交*与通过常规合并获得的相同,但是提交图不同:真正的合并看起来像这样:

...- o ----- *
      \     /
       o - o
Run Code Online (Sandbox Code Playgroud)

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


点号表示法A..B要求“提交可从B,减去提交可从A”。该图看起来像这样(与上面的图相同,为清楚起见在此重复):

...- o ----- *   <-- HEAD=A
      \
       o - o     <-- B
Run Code Online (Sandbox Code Playgroud)

o沿着下部的两个提交都可以从B,上部的o提交和任何更早的提交到达;但是o可以A通过从标记的提交开始*并向后工作来实现较高的提交和任何更早的提交,因此将这些排除在外。那只剩下两个o提交:一个在分支的顶端,B一个在它的顶端。

请注意,如果您进行了真正的合并,A..B那么它将是空的,因为从分支的尖端B可以到达的所有提交也将从分支的尖端可以到达A。(相比之下,B..A这只是提交,*因为该提交可从;但A不能从B;但对于没有实际合并的纯南瓜历史也是如此。)