我的问题是我已经更改了一个文件,例如: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 reset而不使用——hard标志:

git reset HEAD~1

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


使用——软旗而不是——硬旗。

Unix:

git reset --soft HEAD^

窗口:

git reset --soft HEAD~

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


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

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

然后你会得到一条消息,说由于空提交消息而终止提交。


使用以下命令:

$ git reset HEAD~1

在此之后,您还可以查看文件恢复如下响应。

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

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

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

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

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

在你的情况下,我会使用git reset -soft来保存你在索引和工作目录中修改的更改。一定要查看这个以获得更详细的解释。


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

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

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

Git重置——软commit_id

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

Git重置——hard commit_id

这就是软和硬的区别


正如@Amal Kumar所说。只需使用git命令:

git reset HEAD~1