如何取消本地git提交?

我的问题是我更改了一个文件,例如: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文件中新添加的行“这是我的测试线”。这不应该发生。我需要内容在那里。有没有办法保留内容并取消我的本地提交?

1033075 次浏览

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

git reset HEAD~1

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

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

git reset --soft HEAD^

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

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

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

应该是这样的。

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

使用下面的命令:

$ git reset HEAD~1

在此之后,您还可以查看像下面的响应一样恢复的文件。

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

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

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

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

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

在您的情况下,我将使用git reset --soft来保存您在索引和工作目录中修改的更改。请务必查看这个出来以获得更详细的解释。

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

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

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

git reset --soft commit_id

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

git reset --hard commit_id

这就是的区别

正如@Amal Kumar所说。只需使用git逗号:

git reset HEAD~1