如何取消本地git提交

问题描述 投票:613回答:6

我的问题是我已经更改了一个文件,例如:README,为我的测试行添加了一行新行'并保存了文件,然后我发出了以下命令

 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文件中丢失了新增的“我的测试行”。这不应该发生。我需要内容。有没有办法保留内容并取消我的本地提交?

git git-reset git-commit
6个回答
1221
投票

只需使用没有git reset标志的--hard

git reset HEAD~1

PS:在基于Unix的系统上,你可以使用等于HEAD^HEAD~1。在Windows上,HEAD^无法正常工作,因为^发出续线信号。所以你的命令提示符只会问你More?


161
投票

使用--soft而不是--hard标志:

git reset --soft HEAD^

28
投票

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

因此,您可以删除所有行,以便提交消息为空,然后保存文件:

It should look like this.

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

编辑:

您也可以删除所有行,结果将完全相同。

要删除vim中的所有行(如果这是您的默认编辑器),一旦进入编辑器,键入gg转到第一行,然后键入dG以删除所有行。最后,使用wq编写并退出文件,您的提交将被中止。


12
投票

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

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

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

git reset --soft commit_id

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

git reset --hard commit_id

这是软硬的区别


8
投票

您可以通过使用以下参数之一告诉Git如何处理索引(将成为下一个提交的文件集)和工作目录:

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

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

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

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


1
投票

使用下面的命令:$ git reset HEAD~1之后你还可以查看文件恢复如下面的响应。

重置后的未分级更改:M application / config / config.php M application / config / database.php

热门问题
推荐问题
最新问题