由于解决冲突的过程非常糟糕,我在长时间的交互式rebase过程中中止了。使用reflog git恢复rebase
我注意到reflog有refs每次rebase是git rebase --continue
d。
我该如何从上次成功的--continue
点恢复重新贴牌,以便保留之前来自rebase的冲突解决方案? (如果我是从头再次运行变基命令,我必须手动解决,我已经解决了我第一次通过它去了所有的冲突)
例子:
假设一个交互式的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
的引用日志现在看起来是这样
[email protected]{0}: rebase: aborting
[email protected]{1}: rebase -i (pick): updating HEAD
[email protected]{2}: rebase -i (pick): updating HEAD
[email protected]{3}: rebase -i (edit): updating HEAD
[email protected]{4}: rebase -i (start): checkout 000000
我想要做的是git reset --hard [email protected]{1}
并继续原来的rebase过程,给出“真正丑陋的合并冲突”的另一个尝试(并继续挑选000005)。
假设过去的000005有很多历史(或未来?),这是非常复杂的(包括来自其他分支的合并提交等)。没有比重放整个'git cherry-pick'和'git merge'序列更简单的方法吗? – arcyqwerty
使用类似的方法,如果我还在rebase的早期阶段,创建一个新的分支并再次运行相同的rebase命令会更容易一些,使用'git checkout'解决合并过程?这会创造任何奇怪的历史指向孤儿rebase参考? – arcyqwerty
@arcyqwerty:一个互动的rebase *是一系列的樱桃选择。这就是为什么指令中的单词是“挑选”的原因。重新激活通常会删除合并;交互式底座可以让你保存它们,但是它的做法是充满毛边角落的情况。请参阅rebase脚本,例如'vim $(git --exec-path)/ git-rebase - interactive'。上面的“错误”方法是可行的,因为我们创建了一个新的分支,其小费是您在放弃重新分配工作之前做出的最后一次提交,也就是说,我们只是将标签粘贴到匿名分支上。 – torek