2015-11-06 90 views
6

我喜歡git rebase -i HEAD~5來壓扁我的提交。有時我認爲我需要回去5次提交,但後來意識到我需要7次。然而,git已經在vim中引入了rebase編輯器.git/rebase-merge/git-rebase-todoGit:取消交互式底線

如果我退出該緩衝區(VIM)然後git的說:

Successfully rebased and updated refs/heads/my-branchname 

有沒有辦法在編輯器/從W停止底墊?我想我可以從另一個shell中得到git rebase --abort,但不知道那個git-rebase-todo文件會在另一個緩衝區中編輯的時候會做什麼。

+1

如果你還沒有在文件中改變任何東西那麼即使該分支是「 「所有的提交都是相同的,所以它實際上是一個沒有運行的。 –

回答

10

如果你在看起來像這樣的初始交互底墊編輯器窗口:

pick f7f3f6d changed my name a bit 
pick 310154e updated README formatting and added blame 
pick a5f4a0d added cat-file 

# Rebase 710f0f8..a5f4a0d onto 710f0f8 
... 
... 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 

您可以通過刪除編輯器窗口中的全部內容,並保存它,或導致編輯器中止底墊關閉一個錯誤代碼。

在VIM這可以用d SHIFT+g隨後:wq來完成,或者可替換地使所述編輯器的錯誤退出作爲麥克富氫指出了使用:cq

如果你已經離開那個窗口並繼續進行下面的壓縮/編輯/ etc,那麼這將不會中止整個rebase,而只會改變當前正在編輯的commit。此時,您可以像上面那樣殺掉編輯器,但是您還需要在命令行上執行git rebase --abort

+0

這是不正確的。如果你想放棄整個rebase操作,但是你正處於一系列交互式rebasing的最後一部分,這不會「中止」交互式rebase。它只會中止當前的rebase step commit。 – fourpastmidnight

+0

@fourpastmidnight我不太確定我是否遵守。刪除和保存僅適用於選擇/壓縮/編輯/等的初始編輯器窗口。如果您已經離開並且在編輯器中進行了單獨的壓縮分辨率,那麼這不適用。你說的是這種情況嗎? – whaleberg

+0

是的,這是完全正確的。例如,我明白操作系統的問題是關於終止修整過程,但只有在操作系統在編輯窗口中才能實現。我昨天發現自己處於類似的情況,並嘗試了你在回答中提出的建議。不幸的是,它的行爲確實與你剛剛在評論中描述的方式一致。也許澄清你的答案將有助於他人避免我的錯誤(我自己對互動式底牌有點新鮮)。無論如何,我可以再次重新編輯和編輯/拆分提交,但行爲是意外的。 – fourpastmidnight

6

您可以使用非零退出代碼退出vim,通過鍵入:cq來取消rebase。這樣做的結果是:

$ git rebase -i HEAD~4 
# enter vim, then type :cq<enter> 
Could not execute editor 

從vim的幫助頁面我們可以看到,CQ是短期的cquit

             *:cq* *:cquit* 
:cq[uit][!]    Quit Vim with an error code, so that the compiler 
         will not compile the same file again. 
         WARNING: All changes in files are lost! Also when the 
         [!] is not used. It works like ":qall!" |:qall|, 
         except that Vim returns a non-zero exit code. 
+0

好吧,我會咬人的;什麼是':cq'? – Meltemi

+0

@Meltemi我用'cq'的解釋更新了我的答案。 –