从中间删除 git 合并

Remove git merges from the middle

我们使用合并工作流维护分支结构。结果,我们的主分支提交层次结构如下所示。

但是,由于我们使用的 Gitlab 社区版不压缩和变基合并,有时开发人员会忘记执行一个或另一个合并提交,看起来像这样。

我从中恢复的通常方法是将 master 重置为这些合并之前的最后一次良好提交,然后重播每个合并(在正确地重新设置和压缩之后)以合并它们。

更好的方法可能是使用 git rebase --onto 命令在修复错误的合并后重播正确的合并。但是,我一直无法找出正确的方法来做到这一点。我做的是:

  1. 将主分支重置为最后一次良好合并的提交。
  2. 在变基分支之上变基错误提交(不是压扁变基)。
  3. 在变基分支上合并变基后的压缩提交。
  4. 对任何其他错误提交重复该过程。
  5. 最后以与步骤 2-3 相同的方式重放所有良好的合并。

我尝试使用 git rebase -ip --onto <last_good_commit> 重播我在第 5 步中的良好合并,但这似乎交换了提交的父顺序。谁有改进我的工作流程的好方法,这样我就不必手动重放每个合并?

git rebase -ip --onto <last_good_commit> 似乎不完整。

应该是:

git rebase -imp --onto <last_good_commit> <first> <yourBranchToReplay>

如果您已签出 "yourBranchToReplay",则可以省略最后一个参数。
但是你不能省略 <first>,这是要重放的分支的第一个提交,你想放在 <last_good_commit>

之上

如 OP 所述,-m (--merge) 很重要。
我也documented the -p --preserve-merge option of Git 1.8.5 back in 2013

@VonC 的回答几乎是正确的。我必须将 rebase 命令修改为 git rebase -ipm --onto <last_good_commit> <first> <yourBranchToReplay>,它会在固定合并上正确地重新定位所有剩余的合并。