由於解決衝突的過程非常糟糕,我在長時間的交互式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