我的问题是我更改了一个文件,例如:自述文件,为我的测试行添加了一行“ this ”并保存了文件,然后我发出了以下命令
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 ”。 这不应该发生。我需要内容。 有没有办法保留内容并取消我的本地提交?
答案 0 :(得分:1199)
只需使用git reset
而不使用--hard
标记:
git reset HEAD~1
PS:在基于Unix的系统上,您可以使用等于HEAD^
的{{1}}。在Windows上HEAD~1
将无效,因为HEAD^
表示一行继续。所以你的命令提示符只会问你^
。
答案 1 :(得分:154)
使用--soft
代替--hard
标志:
git reset --soft HEAD^
答案 2 :(得分:26)
如果您正处于提交的中间(即已在编辑器中),则可以通过删除第一个#
上方的所有行来取消它。这将中止提交。
因此,您可以删除所有行,以便提交消息为空,然后保存文件:
然后,您会收到一条消息Aborting commit due to empty commit message.
。
编辑:
您也可以删除所有行,结果将完全相同。
要删除vim中的所有行(如果这是您的默认编辑器),一旦进入编辑器,请键入gg
转到第一行,然后dG
删除所有行。最后,使用wq
编写并退出文件,您的提交将被中止。
答案 3 :(得分:8)
你可以告诉Git如何处理你的索引(将成为下一次提交的文件集)和使用其中一个参数执行git reset时的工作目录:
--soft
:只会重置提交,而不会更改索引和工作目录。
--mixed
:这将重置索引以匹配HEAD,而不会触及工作目录。所有更改都将保留在工作目录中,并显示为已修改。
--hard
:它重置所有内容(提交,索引,工作目录)以匹配HEAD。
在您的情况下,我会使用git reset --soft
来保留您在索引和工作目录中修改的更改。请务必查看this out以获取更详细的说明。
答案 4 :(得分:8)
您应该做的第一件事是在删除提交消息之前确定是否要保留本地更改。
使用git log
显示当前的提交消息,然后找到commit_id
之前 要删除的提交,而不是要删除的提交要删除。
git reset --soft commit_id
git reset --hard commit_id
这是软和硬
答案 5 :(得分:1)
使用以下命令: $ git reset HEAD~1 在此之后,您还可以查看文件,如下面的响应那样还原。
重置后的非暂停更改: M application / config / config.php M application / config / database.php