从中间删除 git 合并
Remove git merges from the middle
我们使用合并工作流维护分支结构。结果,我们的主分支提交层次结构如下所示。
但是,由于我们使用的 Gitlab 社区版不压缩和变基合并,有时开发人员会忘记执行一个或另一个合并提交,看起来像这样。
我从中恢复的通常方法是将 master 重置为这些合并之前的最后一次良好提交,然后重播每个合并(在正确地重新设置和压缩之后)以合并它们。
更好的方法可能是使用 git rebase --onto
命令在修复错误的合并后重播正确的合并。但是,我一直无法找出正确的方法来做到这一点。我做的是:
- 将主分支重置为最后一次良好合并的提交。
- 在变基分支之上变基错误提交(不是压扁变基)。
- 在变基分支上合并变基后的压缩提交。
- 对任何其他错误提交重复该过程。
- 最后以与步骤 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>
,它会在固定合并上正确地重新定位所有剩余的合并。
我们使用合并工作流维护分支结构。结果,我们的主分支提交层次结构如下所示。
但是,由于我们使用的 Gitlab 社区版不压缩和变基合并,有时开发人员会忘记执行一个或另一个合并提交,看起来像这样。
我从中恢复的通常方法是将 master 重置为这些合并之前的最后一次良好提交,然后重播每个合并(在正确地重新设置和压缩之后)以合并它们。
更好的方法可能是使用 git rebase --onto
命令在修复错误的合并后重播正确的合并。但是,我一直无法找出正确的方法来做到这一点。我做的是:
- 将主分支重置为最后一次良好合并的提交。
- 在变基分支之上变基错误提交(不是压扁变基)。
- 在变基分支上合并变基后的压缩提交。
- 对任何其他错误提交重复该过程。
- 最后以与步骤 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>
,它会在固定合并上正确地重新定位所有剩余的合并。