2012-02-05 142 views
83

我正在提交。我在vim中輸入了我的提交信息。我現在想起我需要改變一些事情。我意識到還有其他選擇可以實現我想要的功能,但我想知道是否有辦法中止提交,但仍保存我迄今爲止輸入的提交消息。git:中止提交輸入消息

回答

67

是的。將提交消息寫入不同的文件()。然後退出編輯器而不保存(:q!)。如果您以前將文件保存到其原始路徑,請刪除所有內容並首先寫入空文件(空的提交消息將中止提交)。

現在,當您準備好提交「for reals」時,請使用您在備用路徑中保存的消息文件。

或者,將提交消息複製到vim的緩衝區中。

值得一提的是,你真的沒有做到這一點,在所有commit --amend讓你改變它的製作後提交,所以最簡單的辦法是產生與你有什麼承諾,然後修復它推動之前。您甚至可以在完成提交時處於中斷狀態,reset HEAD~(重置您的工作副本在提交之前的狀態),修復您的工作副本,然後commit -a -c [email protected]{1}使用舊的提交消息。

+1

注意:使用「:q!」退出vim如果存在自動填充的合併衝突消息,則不會中止提交。相反,提交將繼續,並且消息不會列出哪些文件發生衝突。 – stephenbez 2016-10-17 22:03:51

+1

沒有工作...... :(它仍然完成了提交 – phyatt 2017-01-13 17:16:43

9

雖然可以中止提交,但另一種方法是將修改爲之後提交。只需提交當前工作,然後進行所需的任何其他更改,即git add,然後運行git commit --amend。您將被放回到提交消息編輯器中,並且當您保存時,提交將被修改爲包含其他更改和您的新提交消息。

54

如果你已經打開VIM寫你的提交信息只是刪除不和git開始將中止線所提交的

Aborting commit due to empty commit message. 
+9

這是特別有用的,當你想中止一個git commit --amend。 – edsko 2014-09-21 09:40:56

+0

這不適用於nano編輯器 – 2015-08-13 12:43:51

+1

問題是如何中止提交但保存提交信息刪除不以#開始的行有效地刪除提交信息,不保存提交信息不知道如何有這麼多upvotes – 2015-12-17 13:54:23

111

如果你的編輯器可以用一個錯誤代碼退出 - - Git將中止提交。當使用VIM時,輸入

:cq 

以非零錯誤代碼退出並中止提交。

+0

這是一個很好的訣竅,修改',否則你將不得不刪除現有的提交信息和':wq'。 – 2015-10-08 00:28:13

+1

好的竅門!然而問題是如何保存提交信息,而不是刪除它。 – 2015-12-17 13:55:58

+0

那麼svn如何做到這一點?它看起來除了退出代碼? – 2016-05-26 22:12:57

-1

@bdonlan回答對於這個問題很好,但我會指出你可能想要一個更好的解決方案的情況。

假設你想添加對上次提交的更改。所以,你做的@bdolan建議:

git add files 
git commit --amend 

試想一下,編寫新的消息,你後悔將這些文件犯下期間。 問題是你被卡住已保存提交消息和退出編輯器(有或沒有保存)會將這些更改添加到最後一次提交。恢復到您在這些操作之前所處的位置需要您split the last commit - 我敢打賭,您希望避免它。

訣竅是保存並退出編輯器,但它只有以#開頭的行或根本沒有行。當你退出,你會與消息打招呼:

Aborting commit due to empty commit message. 

而且你沒有改變最後一次提交的。

+0

如果我明白你是什麼「說話是個問題,那麼你是不正確的;如下所示:'git commit; vim ....; git commit --amend; git reset HEAD @ {1}'。那就是:如果我想「撤消」修正案,那我就不必拆分先前的提交。修改前的HEAD提交對象保存爲HEAD @ {1}'。另外,zetta已經建議刪除所有非註釋行。 – 2016-06-06 02:09:33

4

是的,這是可能的。爲了提交,你的編輯器必須將提交消息寫入文件.git/COMMIT_EDITMSG並以0狀態碼退出。

所以,如果你使用VI/VIM,你可能要執行下列操作...

  1. 寫你提交信息。
  2. 保存與:w提交信息(默認情況下,這將保存當前內容.git/COMMIT_EDITMSG
  3. 退出編輯器錯誤:cq
  4. ...你必須做的事情......即使添加/刪除文件到暫存區。
  5. 繼續與git commit -eF .git/COMMIT_MESSAGE

-F /path/to/file編輯現有的提交信息將填充與/路徑中的任何給定的內容編輯/到/文件。但是,默認情況下,這會立即執行提交,除非您爲編輯另外提供-e標誌。

+0

這個工作,但不太可取,因爲1)它假設我的CWD是.git文件夾的地方2)我使用[git worktrees](https://git-scm.com/docs/git-worktree),以及使用git worktrees,.git實際上是一個_file_,表示真正的.git文件夾在哪裏。 – 2017-01-02 20:47:46

+0

@AlexanderBird這是不正確的......當你想在步驟5中拿起舊的提交信息時,你只需要指定一個相對路徑(比如說你在'/ foo/bar /'目錄下,相對於項目的根目錄)像'git commit -eF ../../。git/COMMIT_MESSAGE' – 2017-01-05 05:24:11

+0

@AlexanderBird酷,還沒有注意到git中有多個工作樹的特性。 Thx的提示!我相信唯一的缺點就是,你必須對你的頭腦進行總體概述,這使你無法專注於實際的代碼。只是爲了在「我離開的地方」提交提交信息,這有點沉重:) – 2017-01-05 05:29:32