我有一个父分支 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 中的符号将导致显示自原始合并库以来的所有更改。
壁球合并压缩了默认分支中的更改历史记录 (...压缩合并时,最好删除源分支。删除源分支可以防止混淆,因为主题分支本身没有将其合并到默认分支中的提交。
来源:
合并策略和挤压合并
将长期存在的分支与南瓜合并时会出现哪些类型的问题?