【问题标题】:How to revert uncommitted changes including files and folders?如何恢复未提交的更改,包括文件和文件夹?
【发布时间】:2011-08-14 00:13:27
【问题描述】:

是否有一个 git 命令可以恢复工作树和索引中所有未提交的更改并删除新创建的文件和文件夹?

【问题讨论】:

  • 好吧,我已经阅读了下面所有不同且难以记住的答案,包括他们的警告和边缘案例以及“如果你有 xxx 就不起作用”,并且坚持删除整个回购,克隆它删除所有编辑和添加的文件。也只有两个命令。 rm -r 项目目录;混帐克隆 xxx。对我来说,这是一个频繁的操作——检查一个 repo 玩弄它,然后想要回到一个干净的结帐,这样我就可以开始修改它了。不是很好,但可以 100% 工作。希望有一天他们会为此添加一个简单的命令。

标签: git git-commit git-reset git-revert git-clean


【解决方案1】:

你可以运行这两个命令:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

【讨论】:

  • 在运行 git clean 之前运行 'git clean -nd' 预览更改以确保您不会删除您关心的未跟踪文件或目录。
  • 为某人省去一趟文档之旅:-f 是强制,-d 是删除目录,-n 是空运行(还有 --dry-run;显示输出而不做任何事情)
  • git clean -i 用于交互模式。
  • 它没有重置我未暂存的文件,我必须先暂存它们。
  • @IgorGanapolsky 您可能正处于合并冲突的中间。尝试运行git merge --abort
【解决方案2】:

如果您只想还原当前工作目录中的更改,请使用

git checkout -- .

在此之前,您可以列出将要恢复的文件,而无需实际执行任何操作,只是为了检查会发生什么,使用:

git checkout --

【讨论】:

  • 当我尝试这个时,我得到“错误:pathspec '。”与 git 已知的任何文件都不匹配。
  • 这和git reset --hard有什么区别?
  • 'git reset --hard' 将撤消分阶段和非分阶段的更改,而 'git checkout -- .'只会撤消未暂存的更改
  • 但是如果你使用 checkout 并且修改了文件,cmd 将返回我需要进行合并,即使我只需要恢复这些更改
  • git checkout -- 将简单地列出将被还原的文件(没有操作,只是列出)。如果您想在执行 git checkout 之前查看哪些文件会受到影响,这将非常有用 -- 。
【解决方案3】:

使用 "git checkout -- ..." 丢弃工作目录中的更改

git checkout -- app/views/posts/index.html.erb

git checkout -- *

删除对 git status 中未暂存文件所做的所有更改,例如

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

【讨论】:

  • git checkout -- * 对我不起作用,除非我在更改文件所在的目录中。要检出整个存储库中的所有文件,您必须执行 git checkout -- :/
  • git checkout -- *中,星号被Shell替换,所有文件和目录都在当前目录下。所以它应该放在子目录中。这个对我有用。但是感谢突出显示我认为接缝更清晰的语法“:/”。
  • 看来我也可以git checkout -- '**/*.md'。就像我现在需要的一样。
【解决方案4】:

一个重要的方法是运行这两个命令:

  1. git stash 这会将您的更改移动到存储区,使您回到 HEAD 状态
  2. git stash drop 这将删除在最后一个命令中创建的最新存储。

【讨论】:

  • 这不适用于未提交的更改,仅适用于已提交的更改。
  • 我已经将它用于未提交的更改并且它有效。
  • @b0xxed1n 存储是关于未提交的更改,显然它确实适用于他们。
  • git stash 用于保存未提交的更改,因此您可以.. 保存它们而不提交。
  • git stash 导致以下错误:fatal: git-write-tree: error building trees Cannot save the current index state
【解决方案5】:
git clean -fd

没有帮助,新文件仍然存在。我所做的是完全删除所有工作树,然后

git reset --hard

请参阅“How do I clear my local working directory in git?”以获取将-x 选项添加到清理的建议:

git clean -fdx

注意 -x 标志将删除 Git 忽略的所有文件,所以要小心(请参阅我参考的答案中的讨论)。

【讨论】:

  • 什么是-fdx? "力、目录和x是什么?
  • @AdiPrasetyo -x 标志也会删除所有被忽略的文件;这可能是一个不受欢迎的效果,所以我更新了我的答案。
  • 我仍然无法变基。我收到错误:错误:无法合并更改。 Patch failed at 0003 创建回调失败的补丁副本位于:
【解决方案6】:

我认为你可以使用以下命令:git reset --hard

【讨论】:

  • hhmm... 我这样做了,但我的文件仍然存在。之后我应该做些什么吗?
  • git reset 仅恢复工作树中未提交的更改。它不会删除新文件和文件夹。我不知道如何用 git 来做到这一点
  • 因此,如果我们通过添加新文件和文件夹来更改系统目录,然后我们想将该目录恢复到以前的状态(不包含这些文件和文件夹),我们不能这样做混帐?所以我们能做的最好的就是恢复文件状态?但是一旦我们创建了一个文件,除非我们手动删除,否则我们无法删除该文件?
【解决方案7】:

如果您有一个未提交的更改(仅在您的工作副本中)并且您希望恢复到最新提交中的副本,请执行以下操作:

git checkout filename

【讨论】:

  • 我在未提交的git rm filename 之后尝试此操作,但它不起作用。 error: pathspec 'filename' did not match any file(s) known to git.
  • 撤销git rm的解决方案是git checkout master -- filename
【解决方案8】:

Git 2.23 引入了git restore 命令来恢复工作树文件。

https://git-scm.com/docs/git-restore

恢复当前目录下的所有文件

git 恢复。

如果你想恢复所有C源文件以匹配索引中的版本,你可以这样做

git restore '*.c'

【讨论】:

【解决方案9】:

请注意,可能仍有一些文件似乎不会消失 - 它们可能未经编辑,但由于 CRLF / LF 更改,git 可能已将它们标记为正在编辑。看看你最近是否对.gitattributes 进行了一些更改。

就我而言,我已将 CRLF 设置添加到 .gitattributes 文件中,因此所有文件都保留在“修改后的文件”列表中。更改 .gitattributes 设置会使它们消失。

【讨论】:

    【解决方案10】:

    您只需使用以下 git 命令即可恢复您在存储库中所做的所有未提交更改:

    git checkout .
    

    示例:

    ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   application/controllers/Drivers.php
            modified:   application/views/drivers/add.php
            modified:   application/views/drivers/load_driver_info.php
            modified:   uploads/drivers/drivers.xlsx
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
    $ git checkout .
    
    ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    
    nothing to commit, working tree clean
    

    【讨论】:

      【解决方案11】:

      来自 Git 帮助:

       Changes to be committed:
            (use "git restore --staged <file>..." to unstage)
      
          Changes not staged for commit:
            (use "git add <file>..." to update what will be committed)
            (use "git restore <file>..." to discard changes in working directory)
      

      【讨论】:

        【解决方案12】:

        一条安全而漫长的路:

        1. git branch todelete
        2. git checkout todelete
        3. git add .
        4. git commit -m "I did a bad thing, sorry"
        5. git checkout develop
        6. git branch -D todelete

        【讨论】:

          【解决方案13】:

          用途:

          git reset HEAD filepath
          

          例如:

          git reset HEAD om211/src/META-INF/persistence.xml
          

          【讨论】:

            【解决方案14】:

            我通常使用这种方式效果很好:

            mv fold/file /tmp
            git checkout fold/file
            

            【讨论】:

            • 这与拥有 357 个“赞”的人所提议的完全一样。只是您甚至可以创建新签出文件的备份。
            猜你喜欢
            • 1970-01-01
            • 2012-07-27
            • 2011-02-06
            • 1970-01-01
            • 2013-01-29
            • 1970-01-01
            • 2012-08-01
            • 1970-01-01
            • 2013-09-30
            相关资源
            最近更新 更多