【问题标题】:git: abort commit in the middle of typing messagegit:在输入消息的过程中中止提交
【发布时间】:2012-02-05 04:26:03
【问题描述】:

我正在提交。我已经在 vim 中输入了我的提交信息。我现在记得我需要改变一些东西。我意识到还有其他选择可以完成我想要的,但我想知道是否有办法中止提交但仍然保存我到目前为止输入的提交消息。

【问题讨论】:

    标签: git


    【解决方案1】:

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

    :cq
    

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

    【讨论】:

    • 这是一个很好的中止commit --amend的技巧,否则你将不得不删除现有的提交消息和:wq
    • 好招!但是问题是如何保存提交消息,而不是删除它。
    • 那么 svn 是如何做到这一点的呢?除了退出代码,它还看什么?
    • 非常适合进行交互式 rebase aka squashing commits
    • 在 rebase 期间执行 git commit --amend 而不是 git rebase --continue 时救了我的命。
    【解决方案2】:

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

    现在,当您准备好“真正地”提交时,请使用您保存在备用路径中的消息文件。

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

    值得注意的是,您真的根本不需要这样做commit --amend 允许您在提交完成后更改它,因此简单的解决方案是使用您的内容生成提交'已经得到然后在推动之前修复它。您甚至可以在其损坏的状态下完成提交,reset HEAD~(将您重置为您的工作副本在提交之前的状态),修复您的工作副本,然后 commit -a -c HEAD@{1} 使用旧的提交消息。

    【讨论】:

    • 注意:使用 ":q!" 退出 vim如果有自动填充的合并冲突消息,则不会中止提交。相反,提交将继续,并且消息不会列出哪些文件有冲突。
    • write the empty file (an empty commit message will abort the commit) 部分工作就像一个魅力,谢谢!
    【解决方案3】:

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

    Aborting commit due to empty commit message.
    

    【讨论】:

    • 这在你想中止 git commit --amend 时特别有用。
    • 问题是如何中止提交但保存提交消息。删除不以 # 开头的行会有效地删除提交消息,而不是保存提交消息。不知道这怎么会有这么多赞成票。
    • ggdG 将剪切邮件的所有内容,然后下次运行 vim 时,您可以只 P 之前剪切的文本。
    • 使用 nano,ctrl+k 所有行,然后保存并退出将中止
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      是的,这是可能的。为了提交,您的编辑器必须将提交消息写入文件 .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 将使用 /path/to/file 中的任何给定内容填充编辑器。但是,默认情况下,这会立即执行提交,除非您另外为 editing 提供 -e 标志。

      【讨论】:

      • 这行得通,但不太可取,因为 1)它假设我 CWD 是 .git 文件夹所在的位置 2)我使用 git worktrees,并且使用 git worktrees,.git 实际上是一个 file 说明真正的 .git 文件夹在哪里。
      • @AlexanderBird 这不是真的......当你想在步骤 5 中获取旧的提交消息时),你只需要指定一个相对路径(假设你在 @ 987654329@ 目录,相对于项目根目录)如git commit -eF ../../.git/COMMIT_MESSAGE
      • @AlexanderBird 很酷,还没有注意到 git 中具有多个工作树的功能。谢谢提示!我认为唯一的缺点是,您必须在脑海中保持总体概述,这会阻止您专注于实际代码。只是为了获取关于“我离开的地方”的提交消息,它有点沉重:)
      • @AlexanderBird 然后代替:w:sav committmpgit commit -eF committmp
      【解决方案6】:

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

      git commit -m'my message' // etc

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

      【讨论】:

        【解决方案7】:

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

        假设您想对上次提交添加更改。所以你按照@bdolan 的建议去做:

        git add files
        git commit --amend
        

        想象一下,在编写新消息期间,您后悔将这些文件添加到该提交中。 问题是您遇到了已保存提交消息,退出编辑器(有或没有保存)会将这些更改添加到最后一次提交。恢复到您在这些操作之前所处的位置需要您 split the last commit - 我敢打赌您想避免它。

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

        Aborting commit due to empty commit message.
        

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

        【讨论】:

        • 如果我理解你说的有问题,那你就错了;如此处所示:git commit; vim ....; git commit --amend; git reset HEAD@{1}。也就是说:如果我想“撤消”修改,那么我确实必须拆分先前的提交。修改前为 HEAD 的提交对象保存为HEAD@{1}。此外,zetta 已经建议删除所有非注释行。
        猜你喜欢
        • 2011-08-01
        • 2012-05-04
        • 1970-01-01
        • 2011-03-22
        • 2018-03-11
        • 1970-01-01
        • 2017-01-21
        • 2011-09-07
        • 1970-01-01
        相关资源
        最近更新 更多