git 使用 reflog 恢复变基

git resume rebase using reflog

由于冲突解决出现严重错误,我在一个漫长的交互式变基过程中中止了。

我注意到 reflog 对每次变基 git rebase --continued 都有引用。

如何从上次成功的 --continue 点恢复变基,从而保留之前的变基冲突解决方案? (如果我要从头开始再次 运行 rebase 命令,我将不得不手动解决我第一次通过它时已经解决的所有冲突)

示例:

假设交互式变基如下(其中 000002 已成功解决,而 0000004 是一场彻底的灾难,变基被中止)

edit 000001 Edit to this commit
pick 000002 Easy merge conflict, resolved
pick 000003 Commit 3
pick 000004 Really ugly merge conflict, Abort!
pick 000005 Commit 5

reflog 现在看起来像这样

HEAD@{0}: rebase: aborting
HEAD@{1}: rebase -i (pick): updating HEAD
HEAD@{2}: rebase -i (pick): updating HEAD
HEAD@{3}: rebase -i (edit): updating HEAD
HEAD@{4}: rebase -i (start): checkout 000000

我想做的是 git reset --hard HEAD@{1} 并继续原来的 rebase 过程,再给 "Really ugly merge conflict" 一次尝试(并继续选择 000005)。

Rebase 没有内置任何东西来做这个,做起来有点棘手 "right",但是有一个简单的方法 "wrong" 通过创建一个 new 分支指向你喜欢的变基部分:

$ git branch newbr HEAD@{1}

现在您可以查看分支 newbr 并使用 git cherry-pick 开始使用丑陋的合并冲突版本。缺点是您必须手动 git cherry-pick 您想要引入的提交集(在本例中为 4 和 5)。

(一旦您将所有内容精心挑选到新分支中,只需将原始分支重新指向新的最终提交——这是新分支的尖端——就像 git rebase 所做的那样成功。您可以删除新分支,因为您的手动模式 rebase 已完成。)