你是对的:将新主题分支合并到V1.1 将引入提交D。 (将其合并到V1.0 将同时引入C 和 D。)
我只是假设我们正在处理V1.1;这同样适用于V1.0,除了有时还要处理C。 (而且我不确定你为什么在编辑中将V1.1 更改为otherbranch,但我会在下面使用otherbranch,因为我做了很多复制粘贴......)
您至少有以下选择:
- 通过“真正的”合并引入 D(如果需要,可以使用
--no-ff,尽管不是),然后恢复它。
- 与
--no-commit进行“真正的”合并(就像--no-ff一样),然后反向应用D(最简单的git revert --no-commit,但你也可以git show D | git apply -R -,例如),然后提交结果。
- 执行“squash”合并,然后删除
D,就像使用任一“真实”合并一样。
- 樱桃采摘(带或不带
--no-commit)E、F 和G。
这些都会导致不同的提交图,除了 squash-merging 和“取消应用”D 然后进行一次提交会产生与樱桃采摘 E-through- 相同的图(和文件) G 和 --no-commit 然后提交结果。
真正的合并给你一个真正的合并提交:
V1.0 : B.A--B.B
otherbranch :/ C.A--C.B-----M
/ / /
master: A--B--C--D /
\ /
topicbranch: E--F--G
如果您允许git merge 进行提交(并且它能够自行提交),则生成的树将包含在D 中所做的更改,因为otherbranch 和topicbranch 的合并基础是提交C。但是,如果您抑制提交,然后在工作目录中撤回在提交D 中所做的更改,并且只有然后提交生成的工作目录文件,提交M 的树 将忽略D 中的更改。
缺点是,在将来尝试将 master 或 topicbranch 合并到 otherbranch 时,git 会认为 D 的更改在那里(因为它们是,你刚刚删除了它们)。
对 D 进行单独的还原提交会给出此图:
V1.0 : B.A--B.B
otherbranch :/ C.A--C.B-----M--R
/ / /
master: A--B--C--D /
\ /
topicbranch: E--F--G
其中R 是“还原D”更改。同样,将来尝试将 master 或 topicbranch 合并到 otherbranch 不会尝试引入来自提交 D 的更改,因为 git 可以告诉它们已经被放入。(这和以前的情况是,您将D 取出的事实被明确记录为单独的提交——除非他们去看,否则任何人都不会注意到,但他们可能更容易找到他们是否/何时 去看看,如果这只是混合到合并提交中M。)
在 git 中,“壁球合并”提交与常规合并提交完全相同,只是 M 只有一个父级。 Git 像往常一样经历相同的合并机制,它只是没有进行最终提交,也没有进行设置,以便您的手册 git commit 将进行双亲提交。所以你得到了这个图表:
V1.0 : B.A--B.B
otherbranch :/ C.A--C.B-----M
/ /
master: A--B--C--D
\
topicbranch: E--F--G
(调用此提交M 是一种谎言,因为它不是合并,而是什么鬼:-))。同样,您可以选择是否在提交M 之前或之后反转D 之前,应用相同的推理。但是,在任何一种情况下,由于M 不是实际 合并提交,因此稍后在分支中合并的尝试将尝试引入D,因为合并基础没有移动。 (当然,它还会尝试再次通过G 引入E。如果幸运的话,git 将能够判断它们已经在其中,并且合并将自动“思考”类似“哦,好的,已经到了,继续!”。如果没有,您将需要进行一些手动清理。)
最后,精选提交会复制他们的更改,或者使用--no-commit 只是应用他们的更改并跳过提交部分。因此,假设您将所有三个组合成一个提交 N,您将得到如下图:
V1.0 : B.A--B.B
otherbranch :/ C.A--C.B---N
/ /
master: A--B--C--D
\
topicbranch: E--F--G
如果你把它们分开你会得到E'--F'--G'(这些名字表示你会看到的补丁如果你git show提交将基本上匹配你看到的git show的补丁E,F和G)。如果你将它们组合成一个大的新补丁N,那么N 看起来与M 在壁球合并案例中的外观非常相似,只是你不必“取消应用”@987654391 @,因为您不会提出这些更改。
无论哪种方式,您都必须为分支 V1.0 重复整个过程。
(但请注意:如果您有一个提交 N 引入了 E+F+G,那么您可以执行一个 git cherry-pick 或 N。这实际上并不比 @987654397 中的一个樱桃选择更容易@,除了可能要考虑。)