如何取消本地git提交?

kkbh8khc  于 2022-12-10  发布在  Git
关注(0)|答案(7)|浏览(227)

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

zzlelutf

zzlelutf1#

只使用不带--hard标志的git reset

git reset HEAD~1

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

2nbm6dog

2nbm6dog2#

使用--soft而不是--hard标志。
Unix系统:

git reset --soft HEAD^

windows :

git reset --soft HEAD~

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

pb3skfrl

pb3skfrl3#

如果你正在提交中(即已经在编辑器中),你可以通过删除第一个#以上的所有行来取消它,这将中止提交。
所以你可以删除所有的行,这样提交消息就是空的,然后保存文件:

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

g6baxovj

g6baxovj4#

您应该做的第一件事是在删除提交消息之前确定是否要保留本地更改。
使用git log来显示当前的提交消息,然后找到commit_id在你想要删除的提交之前,而不是你想要删除的提交。

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

git reset --soft commit_id

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

git reset --hard commit_id
这就是"软"和"硬"的区别

hrysbysz

hrysbysz5#

你可以告诉Git在执行git重置时如何处理你的索引(下一次提交的文件集)和工作目录,方法是使用以下参数之一:
--soft:只重置提交,而不更改索引和工作目录。
--mixed:这将重置索引以匹配HEAD,而工作目录将不会被触及。所有更改将保留在工作目录中,并显示为已修改。
--hard:它重置所有内容(提交、索引、工作目录)以匹配HEAD。
在您的例子中,我会使用git reset --soft来保存您在索引和工作目录中修改的内容。

rdlzhqv9

rdlzhqv96#

使用以下命令:

$ git reset HEAD~1

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

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

oknwwptz7#

就像@Amal Kumar说的,只要使用git命令:

git reset HEAD~1

相关问题