在git中撤销上一次提交后的所有更改

434

我该如何撤回最近一次提交之后对目录做出的每一个更改,包括删除添加的文件、重置修改过的文件以及恢复已删除的文件?


可能是回滚到以前的Git提交的重复问题。 - nawfal
8
@nawfal 可能是副本,但“在最后一次提交后重置所有更改”比相应的“如何还原Git存储库”符合更多的搜索标准(在Google中搜索的单词)。 至少对于像我这样母语不是英语的人来说是这样 :d - Shirish Herwade
3个回答

756

首先,重置任何更改

这将撤销您对已跟踪文件所做的任何更改并恢复删除的文件:

git reset HEAD --hard

第二步,删除新文件

这将删除自上次提交以来添加的任何新文件:

git clean -fd

由于 .gitignore 文件的存在,未被跟踪的文件将被保留,它们不会被删除。

警告:使用 -x 而不是 -fd 将删除被忽略的文件。你可能不想这样做。


9
@Adam: 有时候你可能也需要使用 git clean 命令的 -x 选项,它可以让该命令同时移除被忽略的文件。 - Cascabel
39
如果您想保留由于.gitignore未被跟踪的文件,请小心使用git clean -fd命令。 - bitsoflogic
4
相反,git clean -fd不会删除被忽略的文件,需要添加-x参数。 - Robert Siemer
7
@RobertSiemer 实际上可以!如果您有任何完全由被忽略文件组成的文件夹,它将删除这些文件夹并因此删除被忽略的文件。考虑像这里的一个 .gitignore 文件:https://dev59.com/e18e5IYBdhLWcg3wnrcQ。在这个例子中,假设一些文件夹没有 PHP 文件。"git clean -fd"将删除那些文件夹和未跟踪的文件。已在 git 版本 1.9.1 中测试。 - bitsoflogic
4
为什么需要第二个“清理”呢? - Shirish Herwade
显示剩余8条评论

106

如何撤销最近一次提交后对目录所做的每个更改,包括删除添加的文件、重置修改的文件和重新添加已删除的文件?

  1. 您可以使用以下命令来撤销对 已跟踪 文件的更改:

    git reset HEAD --hard
    
  2. 您可以使用以下命令删除 未被跟踪的 文件:

    git clean -f
    
  3. 您可以通过以下方式删除未跟踪的文件和目录:

  4. 您可以使用以下命令删除 未跟踪的 文件和目录:

  5. git clean -fd
    

    但是您不能撤销对未跟踪文件所做的更改

  6. 您可以删除忽略和未跟踪的文件和目录

  7. git clean -fdx
    

    但是您无法撤消对已忽略文件的更改

您还可以将clean.requireForce设置为false

git config --global --add clean.requireForce false

当您使用git clean命令时,为避免使用-f--force)选项,请注意。


3
太棒了,正是我需要的。感谢提供所有相关指令的比较! - Marquee
“git reset HEAD --hard” 对我来说似乎足以撤销对最新提交的更改。 - Pathros

-10

在这种情况下有两个命令可用:

根>git reset --hard HEAD~1

根>git push -f

要了解更多git命令,请参考页面


6
git push -f与这个问题无关,在这种情况下是危险的。 - mustache1up
2
这将从远程仓库中删除最后一次提交,而不是放弃自上次提交以来的所有更改。 - TheKodeToad
1
请删除此答案,它与 OP 要求的相反,因此不安全。删除此答案还将恢复您失去的声望。 - aggregate1166877
1
这将删除所有内容,包括最后一次提交。 - Thameem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接