853

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

4

6 回答 6

1603

只需在git reset没有--hard标志的情况下使用:

git reset HEAD~1

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

于 2011-01-31T12:17:08.753 回答
241

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

git reset --soft HEAD^

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

于 2012-08-10T08:02:56.807 回答
53

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

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

它应该看起来像这样。

然后,您将收到一条消息,内容为Aborting commit due to empty commit message.

于 2017-03-09T21:09:16.163 回答
25

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

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

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

git reset --soft commit_id

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

git reset --hard commit_id

这就是软硬区别

于 2018-09-02T03:43:00.227 回答
11

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

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

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

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

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

于 2018-05-29T10:22:42.300 回答
5

使用以下命令:

$ git reset HEAD~1

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

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
于 2018-05-14T13:25:38.927 回答