1174

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

4

14 回答 14

1918

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

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

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd
于 2011-04-28T02:37:48.167 回答
596

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

git checkout -- .

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

git checkout --
于 2013-06-21T04:41:18.557 回答
124

使用 "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
于 2013-03-13T01:16:12.930 回答
63

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

  1. git stash 这会将您的更改移动到存储区,使您回到 HEAD 状态
  2. git stash drop 这将删除在最后一个命令中创建的最新存储。
于 2013-07-18T09:20:08.270 回答
24
git clean -fd

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

git reset --hard

有关添加清理选项的建议,请参阅“如何在 git 中清除我的本地工作目录? ”:-x

git clean -fdx

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

于 2012-10-15T06:57:27.797 回答
17

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

于 2011-04-27T16:10:12.637 回答
14

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

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

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

混帐恢复。

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

git restore '*.c'

于 2019-08-21T01:33:07.893 回答
12

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

git checkout filename
于 2018-10-23T07:17:32.307 回答
7

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

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

于 2016-07-19T10:07:19.223 回答
5

您可以只使用以下 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
于 2019-04-26T05:08:31.060 回答
4

来自 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)
于 2020-08-25T19:11:37.670 回答
-3

一条安全而漫长的路:

  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
于 2013-11-19T02:08:30.930 回答
-3

采用:

git reset HEAD filepath

例如:

git reset HEAD om211/src/META-INF/persistence.xml
于 2015-02-09T13:18:40.303 回答
-3

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

mv fold/file /tmp
git checkout fold/file
于 2016-04-08T07:17:05.770 回答