我有一个带有子分支B的父分支A.在分支B中,我有两个单独的提交。我将A中的分支B合并为像这样的壁球
git merge --squash B
当我将分支A与分支B进行比较时:
git log A..B
它显示来自分支B的两个提交都是未合并的。我如何将它与父分支A的压缩提交进行比较?这样两个分支之间的响应没有区别
由于
答案 0 :(得分:3)
引用git merge
documentation,--squash
表示:
生成工作树和索引状态,就像发生了真正的合并一样(合并信息除外),但实际上没有提交或移动
HEAD
,也没有记录$GIT_DIR/MERGE_HEAD
导致nextgit 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
到达;但是对于无实际情况,这是正确的 - 仅限南瓜历史。)