如何在压缩和合并后重新整合主题分支?

How to reintegrate topic branches after a squash and merge?

我通常完全接受 git 中的合并,但我最近开始处理一个存储库,其中将主题分支合并到 master 中的策略是将它们压缩成一个提交。

我刚刚发现,在尝试重新整合基于第一个主题分支的第二个主题分支时,这会导致完全混乱。

假设我有:

A-I'          master
 \
  B-C-E-G-I   topicA
     \   \
      D-F-H-J topicB

其中 I' 是从 topicAmaster 的压缩合并。

如果我将 master 合并到 topicB 那么就会有很多冲突。使用合并工具是无用的,因为 LOCAL 将包含来自 ABCDEFGHJ 的更改,REMOTE 将是 ABCEGI,而 BASE 将是 A。尝试查看 IDFHJ 之间的差异可能真的很困难。如果我放弃合并工具,只区分本地和远程,那么变化会更加明显,但我必须手动解决所有冲突。

如果我在 master 上变基 topicB 那么它会变得更加奇怪,因为各种文件在 topicA 上的 BI 之间发生了变化,因此重新应用提交ABCDFJI' 会产生废话。

如何让 I' 变成 topicB

是否有更好的方法来集成主题分支,以便将来避免这种情况?

小恶原来是:

git rebase --onto origin/master topicA topicB

我没有太注意应用了哪些提交,但我猜合并提交 (H) 丢失了。

至于避免这种情况,如果主题分支要被挤压合并,那么合并主题分支似乎是自找麻烦,因为这实际上是在重写上游分支的历史,众所周知这是个坏主意.

我很想听听其他人是如何解决这个问题的,因为围绕合并的 FUD 似乎人们倾向于将变基作为 "simpler" 工作流程。


另一个我发现非常有用的变体是:

git rebase -i -r --onto origin/master topicA topicB

这将启动一个交互式变基并向您显示在哪些分支上进行了提交。这使得删除在 topicA 上所做的任何提交变得非常容易。如果没有这个,这些提交将被重播到 master 上,这可能会导致各种冲突,因为这些更改已经存在。