撤销所有未提交或未保存的Git更改

1268

我想撤销自上次提交以来的所有更改。我尝试了git reset --hardgit reset --hard HEAD,在查看此帖子后。它回应head is now at 18c3773...,但当我查看我的本地源时,所有文件仍然存在。我错过了什么?


6
这是来自Github的绝佳资源:如何使用Git撤销(几乎)所有操作 - jasonleonhard
4
易于理解和简单易读:https://git-scm.com/book/zh/v2/Git-基础-撤销操作 - WelcomeTo
18个回答

2419
  • 这将取消暂存您可能使用git add暂存的所有文件:

git reset
  • 这将还原所有本地未提交的更改(应在存储库根目录中执行):

  • git checkout .
    
    您还可以将未提交的更改仅还原到特定文件或目录:
    git checkout [some_dir|file.txt]
    

    另一种撤销所有未提交更改的方法(打字时间更长,但可从任何子目录中起作用):

    git reset --hard HEAD
    
  • 这将删除所有本地未跟踪的文件,因此只有git跟踪的文件留下:

  • git clean -fdx
    

    警告:使用-x选项将会移除所有被忽略的文件,包括由.gitignore指定的文件!您可能需要使用-n来预览要删除的文件。

    总之,执行以下命令基本上相当于从原始来源进行全新的git clone(但它不会重新下载任何内容,因此速度更快):

    git reset
    git checkout .
    git clean -fdx
    

    典型的用法是在构建脚本中,当你必须确保你的树是绝对干净的,没有任何修改或本地创建的对象文件或构建成果,并且你想让它非常快速地工作,而不是每次都重新克隆整个存储库。


    57
    运行 git clean -fdx 命令删除了我的 node_modules.env 文件,太好了。 - fires3as0n
    14
    你期望发生什么?这是注定会发生的。回答中也有警告。 - Rishav
    5
    对于那些正在搜索为什么 "git checkout ." 不起作用的人,谢谢你提醒它应该在存储库根目录下执行。 - Kamil Czerski
    3
    这是救命稻草。谢谢。 - Mamun
    3
    有关git clean的评论具有误导性。是的,我应该读过警告,是的,我仍然很生气,因为我丢失了我的.env和一些其他东西。但最重要的是,我认为它完全没有抓住重点。我想删除在“git status”中显示为未暂存或未跟踪的文件。因此,这种变量的git clean对于这个目的毫无意义。 - Luxalpa
    显示剩余14条评论

    225

    如果您想要“撤销”所有未提交的更改,只需运行以下命令:

    git stash
    git stash drop
    

    如果您有任何未跟踪的文件(通过运行 git status 来检查),可以通过运行以下命令来删除:

    警告:此操作将删除所有未提交的数据,包括 .gitignore 中的内容

    git clean -fdx
    

    git stash 命令会创建一个新的存储,它将成为 stash@{0}。如果您想要先检查一下,可以运行 git stash list 命令来查看您的存储列表。它会类似于以下内容:

    stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
    stash@{1}: WIP on master: 2b8f269 Map qualifications
    stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
    stash@{3}: WIP on blogit: c9bd270 some changes
    

    每个存储都以前一个提交消息的名称命名。

    8
    确实是一个不错的解决方案,但在使用 git stash 之前需要使用 git add . 对更改进行分阶段处理,因为即使在使用 git stash 后,它也会显示未提交的更改。 - Eres
    1
    你也可以执行命令 git stash --include-untracked 来获取所有文件,这样就不需要进行清理操作,以删除被忽略的文件了。 - esteuart
    5
    对于这个目的来说,git stash -u 更好。千万不要运行 git clean -fdx,否则它会删除被 Git 忽略的文件。 - Luxalpa

    78

    我所做的是

    git add . (adding everything)
    git stash 
    git stash drop
    

    一句话概括:git add . && git stash && git stash drop

    根据M. Justin的指示,还有更短的版本:

    git stash -u && git stash drop


    1
    这是最好的。 - Madrugada
    8
    如果使用 -u--include-untracked 参数创建储藏,可以省略单独的 add 步骤:git stash -u && git stash drop - M. Justin
    2
    到目前为止,这是我发现的最佳选择。 - Des
    git stash -u && git stash drop 对我很有帮助。 - Pathros

    40

    因为之前的回答会永久删除你的更改,所以我添加了这个答案。

    安全的方式

    git stash -u

    解释:存储本地更改,包括未跟踪的更改(使用-u标志)。该命令将您的本地修改保存起来,并恢复工作目录以匹配HEAD提交。

    想要稍后恢复更改吗?

    git stash pop

    解释:该命令将把更改重新应用到当前工作树状态的顶部。

    想要永久删除更改吗?

    git stash drop

    解释:该命令将永久删除存储的条目。

    链接到 git stash 文档


    25

    还有 git stash 命令 - 它可以将你的本地修改暂存起来,并可以在以后重新应用或丢弃

    关于暂存更多信息请查看此处


    17

    撤销未被提交的更改的另一个选项是运行:

    git restore <file>
    
    放弃工作目录中的更改。

    12

    我正在使用SourceTree……您可以通过以下2个简单步骤撤销所有未提交的更改:

    1)只需重置工作区文件状态

    输入图像描述 2)选择所有未暂存的文件(command +a),右键单击并选择删除

    输入图像描述

    就是这么简单 :D


    如果您重置,然后切换分支并在已重置的分支上重新设置基础,这将会带来麻烦。重置很有用,但不应用于放弃未提交的更改。在放弃未提交的更改的情况下,只需存储并删除该存储。 - Dinu Nicolae
    不要依赖UI工具。学会使用CLI,因为当事情出了问题(而UI前端总是会出问题的),或者你被迫通过远程SSH连接工作时,CLI就是能够拯救你的东西 ;) - luis.espinal

    11

    git restore [文件路径]

    例如,我需要放弃对index.html文件所作的最新更改:

    git restore /usr/myPC/folder/index.html
    

    这就是我一直在寻找的,只还原一个文件,而不是所有的更改(尽管我知道问题是关于所有文件的)。 - undefined

    11

    如果你想“撤销”所有未提交的更改或本地更改,只需运行:

    git add . 
    git stash 
    git stash drop
    git clean -fdx
    

    1
    笔误 git add . - Aditya Jain
    @AdityaJain Stack Overflow是一个由社区维护的网站,所以请随意编辑您看到的明显错误。话虽如此,我已经根据您提出的更改编辑了这篇文章。 - M. Justin
    1
    为什么要添加 git clean -fdx? - Nishant Dwivedi
    1
    这很危险!它将清除.gitignore中的所有文件。 - Omar Omeiri

    9

    在 Git 中有三种选项可以撤消本地更改。

    要查看在你的工作目录中所做的更改,你应该运行 git status 命令:

    git status
    

    使用git stash撤销更改
    要放弃所有本地更改,但又想稍后使用它们,您可以运行git stash命令:

    git stash
    

    使用 git checkout 撤销更改
    要永久放弃对文件的本地更改,可以运行以下命令:

    git checkout -- <file>
    

    使用git reset撤销更改
    要永久地放弃对所有文件的本地更改,您可以执行以下操作:

    git reset --hard
    

    来源:https://www.w3docs.com/snippets/git/how-to-discard-unstaged-changes.html

    如何放弃未暂存的更改?
    当您在 Git 中进行更改时,这些更改可能处于三种状态之一:已提交、已暂存或未暂存。 如果您想撤消未暂存的更改并还原文件到最后一次提交的状态,则可以使用以下命令:
    ``` git checkout -- ```
    此命令会将指定文件恢复到上次提交的状态,并删除所有未暂存的更改。
    请注意,此命令会永久性地删除未暂存的更改,因此请谨慎使用。

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