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



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

git merge --squash B 

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

git log A..B

它将分支 B 的两个提交显示为未合并。如何将其与父分支 A 的压缩提交进行比较?这样两个分支之间的响应就不会有区别

谢谢

引用

git merge文档,--squash的意思是:

生成工作树和索引状态,就好像发生了真正的合并一样(合并信息除外(,但实际上不要进行提交或移动HEAD,也不要记录$GIT_DIR/MERGE_HEAD导致下一个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访问;但对于无实际合并的仅壁球历史记录也是如此。

你不能为此使用 git。如果您需要比较文件,您可以使用某种文件比较工具。

执行 squash 合并时,不会创建合并提交;相反,来自一端的更改将作为常规提交应用于另一端。这意味着这些分支的合并基础不会更改,因此当 Git 执行下一次合并时,它会考虑上次考虑的所有更改以及新的更改。这意味着任何冲突都可能需要重新解决。同样,任何使用 ...git diff、git log 或 GUI 中的符号将导致显示自原始合并库以来的所有更改。

壁球合并压缩了默认分支中的更改历史记录 (...压缩合并时,最好删除源分支。删除源分支可以防止混淆,因为主题分支本身没有将其合并到默认分支中的提交。

来源:

合并

策略和挤压合并

长期存在的分支与南瓜合并时会出现哪些类型的问题?

最新更新