2015-09-02 249 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