从中间删除git merges

时间:2018-03-31 17:53:03

标签: git git-merge git-rebase

我们维护一个具有合并工作流程的分支结构。因此,我们的主分支提交层次结构如下所示。

Expected hierarchy

然而,由于我们使用Gitlab社区版并没有压缩和rebase合并,有时开发人员忘记做一个或另一个并合并这样的提交。

Bad merges

我遵循从中恢复的常用方法是在这些合并之前将master重置为上次良好提交,然后重放每个合并(在重新定位和压缩之后)以合并它们。

更好的方法可能是使用ContextCompat.getColor()命令在修复错误合并后重播良好的合并。但是,我一直无法弄清楚这样做的正确方法。我所做的是:

  1. 将master分支重置为最后一次合并的提交。
  2. 在重新分支的分支之上重新启动错误提交(而不是压扁)。
  3. 在重新分支的分支上合并压扁的重新提交。
  4. 对任何其他错误提交重复此过程。
  5. 最后以与步骤2-3相同的方式重播所有良好的合并。
  6. 我尝试使用git rebase --onto重播我在步骤5中的良好合并,但这似乎交换了父级的提交顺序。任何人都有一个很好的方法来改进我的工作流程,这样我就不必手动重放每一个合并?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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