git:在输入消息的中间中止提交


131

我正在承诺之中。我已经在vim中输入了我的提交消息。我现在记得我需要进行一些更改。我意识到还有其他选择可以完成我想要的事情,但是我想知道是否有一种方法可以中止提交,但是仍然保存我到目前为止输入的提交消息。

Answers:


85

是。将提交消息写入另一个文件(:w /some/other/path.txt)。然后退出编辑器而不保存(:q!)。如果您以前将文件保存到其原始路径,请删除所有内容并首先写入空文件(空提交消息将中止提交)。

现在,当您准备提交“ for reals”时,请使用保存在备用路径上的消息文件。

或者,将提交消息复制到vim的缓冲区之一中。

值得注意的是,您实际上根本不需要执行此操作commit --amend让您在完成提交后更改提交,因此简单的解决方案是使用您所拥有的内容生成提交,然后在推送之前对其进行修复。您甚至可以在断线状态下完成提交,reset HEAD~(将您重置为提交之前工作副本所处的状态),修复工作副本,然后commit -a -c HEAD@{1}使用旧的提交消息。


7
注意:使用“:q!”退出vim。如果有自动填充的合并冲突消息,将不会中止提交。相反,提交将继续,并且消息不会列出哪些文件有冲突。
stephenbez

write the empty file (an empty commit message will abort the commit)像魅力一样工作,谢谢!
СашаДавиденко

182

如果您的编辑器可以退出并显示错误代码-Git将中止提交。使用VIM时,键入

:cq

以非零错误代码退出并中止提交。


5
这是终止a的好技巧,commit --amend否则您将不得不删除现有的提交消息和:wq
Alex Jasmin 2015年

2
好招!但是问题是如何保存提交消息,而不是删除它。
伊利亚·林恩

那么svn如何做到这一点?除了退出代码外,它还会显示什么?
Chaim Geretz '16

1
当您进行交互式
基准时,

当我做了一次git commit --amend而不是git rebase --continue在重新定基期间拯救了我的性命。
魏世曾

68

如果打开了vim来编写提交消息,只需删除不以开头的行,git就会中止提交

Aborting commit due to empty commit message.

11
当您想终止git commit --amend时,这特别有用。
edsko 2014年

1
问题是如何中止提交但保存提交消息。删除不以#开头的行将有效地删除提交消息,而不保存提交消息。不知道这有多少投票。
伊利亚·林恩

2
ggdG将剪切消息的所有内容,然后在下次运行时,vim您只能P剪切先前剪切的文本。
oromoiluig '18

使用nano,ctrl + k所有行的作品,然后保存和退出将中止
Juh_

9

虽然您可以中止提交,但是另一种方法是 在以后修改提交。只需提交您当前的工作,然后进行所需的其他任何更改git add,然后运行即可git commit --amend。您将被放回提交消息编辑器中,并且在保存时,将对提交进行修改以包括其他更改和新的提交消息。


7

是的,有可能。为了提交,您的编辑者必须将提交消息写入文件.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另外提供用于编辑的标志。


这行得通,但不太可取,因为1)假设我的CWD是.git文件夹所在的位置2)我使用git worktrees,对于git worktrees来说,.git实际上是一个文件,它说明真正的.git文件夹在哪里。
亚历山大·伯德

@AlexanderBird这是不正确的...当您想在步骤5中提取旧的提交消息时,只需指定一个相对路径(例如,您在/foo/bar/目录中,即相对于项目根目录的相对路径),例如git commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek '17

@AlexanderBird很酷,还没有注意到git中有多个工作树的功能。提示!我相信唯一的缺点是,您必须牢记总体概况,以免您专注于实际代码。只是为了在“我离开的地方收起提交消息,它有点沉重:)
Rudolf Tucek

1
@AlexanderBird然后,而不是:w:sav committmpgit commit -eF committmp
Hashbrown

0

我通常在IntelliJ使用提供的终端进行提交。不幸的是,我的提交是手动的:

git commit -m'my message' // etc

因此,我认为唯一可以做的就是关闭终端窗口!如果要保存,只需突出显示文本,然后复制,然后关闭终端窗口。


-2

@bdonlan答案非常适合这个问题,但我会指出您可能需要更好解决方案的情况。

假设您要向上一次提交添加更改。因此,您按照@bdolan的建议进行操作:

git add files
git commit --amend

想象一下,在编写新消息期间,您后悔将这些文件添加到该提交中。问题是您被已经保存的提交消息所困扰,退出编辑器(保存或不保存)会将这些更改添加到最后的提交中。返回到执行这些操作之前的位置时,您需要拆分上一次提交 -我敢打赌您想避免它。

诀窍是在仅以行开头#或根本没有行的情况下保存并退出编辑器。退出时,您会收到以下消息:

Aborting commit due to empty commit message.

而且您根本没有更改最后的提交。


如果我理解您的意思是有问题的,那么您是错误的。如此处所示:git commit; vim ....; git commit --amend; git reset HEAD@{1}。那就是:如果我要“撤销”的修正,那我就不会有分裂一次提交。修改之前为HEAD的提交对象另存为HEAD@{1}。另外,Zetta已经建议删除所有非注释行。
亚历山大·伯德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.