2015-09-02 208 views
1

由于解决冲突的过程非常糟糕,我在长时间的交互式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)。

回答

1

再次基于没有内置在做这个事情,这是一个有点棘手做“正确的”,但有一个简单的方法来做到这一点“错”通过创建一个分支指向的部分底垫你喜欢:

$ git branch newbr [email protected]{1} 

现在你可以检查出的分支newbr和使用git cherry-pick开始在丑陋的合并冲突的版本。缺点是您必须手动输入git cherry-pick您要带入的提交集(在本例中为4和5)。 (一旦你把所有东西都挑选到了新的分支中,只需将原始分支重新指向新的最终提交 - 这就是新分支的提示 - 就像git rebase将会取得成功一样。删除新的分支,因为你的手动模式重新分配完成。)

+0

假设过去的000005有很多历史(或未来?),这是非常复杂的(包括来自其他分支的合并提交等)。没有比重放整个'git cherry-pick'和'git merge'序列更简单的方法吗? – arcyqwerty

+0

使用类似的方法,如果我还在rebase的早期阶段,创建一个新的分支并再次运行相同的rebase命令会更容易一些,使用'git checkout'解决合并过程?这会创造任何奇怪的历史指向孤儿rebase参考? – arcyqwerty

+0

@arcyqwerty:一个互动的rebase *是一系列的樱桃选择。这就是为什么指令中的单词是“挑选”的原因。重新激活通常会删除合并;交互式底座可以让你保存它们,但是它的做法是充满毛边角落的情况。请参阅rebase脚本,例如'vim $(git --exec-path)/ git-rebase - interactive'。上面的“错误”方法是可行的,因为我们创建了一个新的分支,其小费是您在放弃重新分配工作之前做出的最后一次提交,也就是说,我们只是将标签粘贴到匿名分支上。 – torek