关于git:如何恢复未提交的更改,包括文件和文件夹?

How to revert uncommitted changes including files and folders?

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


您可以运行以下两个命令:

1
2
3
4
5
# Revert changes to modified files.
git reset --hard

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


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

1
git checkout -- .

在此之前,您可以列出将被还原的文件,而不必实际执行任何操作,只需检查将发生什么,使用:

1
git checkout --


使用"git checkout--…"放弃工作目录中的更改

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

1
git checkout -- *

删除对处于git状态的未分页文件所做的所有更改,例如

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


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

  • 这会把你的变化转移到藏匿处,使你回到头部状态。
  • git stash drop这将删除在最后一个命令中创建的最新存储。

  • 1
    git clean -fd

    没用,新文件还在。我所做的是完全删除所有工作树,然后

    1
    git reset --hard

    请参见"如何在Git中清除本地工作目录?"关于增加-x清洁选项的建议:

    1
    git clean -fdx

    注:-x标志将删除所有被git忽略的文件,因此要小心(参见我参考的答案中的讨论)。


    我想您可以使用以下命令:git reset --hard


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

    在我的例子中,我已经将CRLF设置添加到.gitattributes文件中,因此所有文件都保留在"修改文件"列表中。更改.gitattributes设置会使它们消失。


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

    1
    git checkout filename

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

    1
    git checkout .

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    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

    我通常用这种方式工作得很好:

    1
    2
    mv fold/file /tmp
    git checkout fold/file


    一条安全而漫长的路:

  • git branch todelete
  • git checkout todelete
  • git add .
  • git commit -m"I did a bad thing, sorry"
  • git checkout develop
  • git branch -D todelete

  • 用途:

    1
    git reset HEAD filepath

    例如:

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