【问题标题】:How to cancel a local git commit?如何取消本地 git 提交?
【发布时间】:2011-06-18 13:17:45
【问题描述】:

我的问题是我更改了一个文件,例如:README,添加了一个新行 'this for my testing line' 并保存了文件,然后我发出了以下命令:

git status

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   README
#
no changes added to commit (use "git add" and/or "git commit -a")


git add README

git commit -a -m 'To add new line to readme'

我没有将代码推送到 GitHub。现在我想取消这个提交。

为此,我使用了

git reset --hard HEAD~1

但是我从 README 文件中丢失了新添加的行 'this for my testing line'。 这不应该发生。我需要内容在那里。 有没有办法保留内容并取消我的本地提交?

【问题讨论】:

  • 听起来你绝对不是在要求git revert,它创建了一个新的提交,它与恢复的提交的反向差异。重置只是将您当前的分支指向不同的提交,在这种情况下,是您想要“忘记”的提交之前的那个。
  • 注意:可能值得一提的是,如果您将消息留空,git-commit 可能会中止,因此如果您还没有真正完成可能有帮助的提交。

标签: git git-reset git-commit


【解决方案1】:

只需使用 git reset 而不使用 --hard 标志:

git reset HEAD~1

PS:在基于 Unix 的系统上,您可以使用 HEAD^,它等于 HEAD~1。在 Windows 上,HEAD^ 将不起作用,因为^ 表示行继续。所以你的命令提示符只会问你More?

【讨论】:

  • 顺便说一下,这叫--mixedin the manual
  • 较新版本的 Git 甚至允许 @^ 作为 HEAD^ 的简写。
  • 我不知道这是做什么的,但是我的更改列表上出现了很多文件,我没有碰过的文件
  • @feresr 如果您真的没有在上次提交或工作树中触及这些文件,这是由工作树中的其他不一致引起的,例如您在 Windows 上且文件结尾不匹配。
  • 一方面可以重置所有提交吗?
【解决方案2】:

使用--soft 代替--hard 标志:

git reset --soft HEAD^

它将删除最后一次本地(未推送)提交,但会保留您所做的更改。

【讨论】:

  • 如果你打开包管理器控制台并运行这个“git reset --soft HEAD^”,它会做你想要的(和我需要的)。
  • @fider 救世主!不确定接受的答案是否仍然有效,但这应该是 OP 需要的确切答案。
  • git reset --soft HEAD~ 在 Windows 上
【解决方案3】:

如果您正在进行提交(即已经在您的编辑器中),您可以通过删除第一个 # 以上的所有行来取消它。这将中止提交。

所以你可以删除所有行,让提交信息为空,然后保存文件:

然后您会收到一条消息,上面写着Aborting commit due to empty commit message.

【讨论】:

  • 这正是我想要的!这个答案需要更多的支持:)
  • 仅供参考,如果您试图中止 rebase -i mybranchname
【解决方案4】:

您应该做的第一件事是在删除提交消息之前确定是否要保留本地更改。

使用git log 显示当前提交消息,然后找到commit_id之前您要删除的提交,而不是您要删除的提交。

如果要保留本地更改的文件,只需删除提交消息:

git reset --soft commit_id

如果要删除所有本地更改的文件和提交消息:

git reset --hard commit_id

这就是softhard的区别

【讨论】:

  • 我认为恰恰相反。
【解决方案5】:

在执行 git reset 时,您可以使用以下参数之一告诉 Git 如何处理您的索引(将成为下一次提交的文件集)和工作目录:

--soft:只会重置提交,而不会更改索引和工作目录。

--mixed:这将重置索引以匹配 HEAD,而不会触及工作目录。所有更改都将保留在工作目录中并显示为已修改。

--hard:它重置所有内容(提交、索引、工作目录)以匹配 HEAD。

在您的情况下,我会使用 git reset --soft 将您修改后的更改保留在索引和工作目录中。请务必查看this out 以获得更详细的说明。

【讨论】:

    【解决方案6】:

    使用以下命令:

    $ git reset HEAD~1
    

    在此之后,您还可以查看返回的文件,如下所示。

    Unstaged changes after reset:
    M   application/config/config.php
    M   application/config/database.php
    

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多