926

我删除了一些文件。

我还没有提交。

我想重置我的工作区以恢复文件。

我做了一个git checkout .

但是删除的文件仍然丢失。

git status显示:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    cc.properties
#   deleted:    store/README
#   deleted:    store/cc.properties
#

为什么不git checkout .将工作区重置为HEAD

4

24 回答 24

862

输出告诉你你需要做什么。git reset HEAD cc.properties等等

这将取消 rm 操作。之后,git status再次运行 a 将告诉您需要执行 agit checkout -- cc.properties才能取回文件。

更新:我的配置文件中有这个

$ git config alias.unstage
reset HEAD

我通常用来取消舞台的东西。

于 2012-08-14T16:29:32.557 回答
234

您已经进行了删除,因此您需要执行以下操作:

git checkout HEAD cc.properties store/README store/cc.properties

git checkout .仅从已进行删除的索引中签出。

于 2012-08-14T16:31:12.267 回答
209

做就是了git checkout path/to/file-I-want-to-bring-back.txt

于 2014-01-23T11:57:05.850 回答
176

要一次自动恢复所有未暂存的删除,而无需指定每个路径:

git ls-files -z -d | xargs -0 git checkout --

要一次自动恢复所有分阶段删除,无需指定每个路径:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --
于 2014-11-12T17:29:51.137 回答
90

由于您正在执行git checkout .,因此您似乎正在尝试将分支恢复到上次提交状态。

您可以通过git reset HEAD --hard

警告

这样做可能会删除您的所有最新修改并取消您的修改,例如,您可能会丢失工作。这可能是您想要的,但请查看文档以确保。

于 2012-12-21T19:54:46.330 回答
81

如果你用过

git rm filename

然后删除文件

git checkout path/to/filename

不起作用,所以在这种情况下

git checkout HEAD^ path/to/filename

应该管用

于 2016-03-31T15:21:10.767 回答
31

这是在我的 Mac 上帮助我的命令。我尝试了其他一些解决方案,但它们对我不起作用。

OSX Mavericks 上的 Git 版本

mac-pro:main chris$ git version
git version 1.8.5.2 (Apple Git-48)

命令

git checkout HEAD -- path/to/file/file.cc
于 2014-03-15T20:55:16.240 回答
24

以下是不同的案例作为帮助他人的参考:

如果尚未提交删除,则下面的命令将在工作树中恢复已删除的文件。

$ git checkout -- <file>

您可以使用以下命令获取工作树中所有已删除文件的列表。

$ git ls-files --deleted

如果删除已经提交,找到它发生的提交,然后从这个提交中恢复文件。

#find the commit hash where it had this file deleted
$ git rev-list -n 1 HEAD -- <file>

它应该给你类似的东西c46e81aa403ecb8a0f7a323a358068345,现在将这个提交哈希与父运算符 ( ^) 一起使用,如下所示:

$ git checkout <commit>^ -- <file>

例子:

$ git checkout c46e81aa403ecb8a0f7a323a358068345^ -- <file> 

如果您正在寻找要恢复的文件的路径,以下命令将显示所有已删除文件的摘要。

$ git log --diff-filter=D --summary

如果您只想显示文件列表:

git log --diff-filter=D --summary | grep "delete mode"
于 2020-02-12T19:04:03.167 回答
23

如果您想一次恢复所有文件

请记住使用句点,因为它告诉 git 抓取所有文件。

此命令将重置头部并取消暂存所有更改:

$ git reset HEAD . 

然后运行它来恢复所有文件:

$ git checkout .

然后做一个 git status,你会得到:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
于 2015-02-10T14:39:55.950 回答
19
git checkout HEAD -- client/src/pp_web/index.cljs
于 2015-04-17T20:51:46.067 回答
18

用于git ls-files检出已删除 (-d) 或修改 (-m) 的文件。

git checkout $(git ls-files -d)

请参阅如何在 git checkout 上仅恢复已修改的文件?

于 2018-06-20T00:35:33.607 回答
9

你想看看这个吗

这适用于您使用的情况

git checkout -- .

在你提交某事之前。

您可能还想删除尚未创建的已创建文件。而你不想要它们。和 :

git reset -- .
于 2016-09-02T15:38:15.533 回答
6

如果您还没有提交任何更改,您所要做的就是存储这些更改,您将返回到最后一个工作提交。

git stash
git stash clear
git clean 
于 2015-03-02T23:14:31.050 回答
6

在寻找有关如何取消删除从另一个分支合并后在我的工作目录中删除的文件的答案时找到了这篇文章。合并后还没有提交。由于这是一个正在进行的合并,我不能只使用以下方法将其添加回来:

$ git reset <commitid#-where-file.cpp-existed> file.cpp

除了重置之外,我还必须执行另一个步骤才能恢复文件:

$ git checkout -- file.cpp
于 2015-09-15T17:14:52.883 回答
3

如果您正在寻找已删除的目录。

 git checkout ./pathToDir/*
于 2015-06-08T13:52:56.627 回答
3

较新的 git(我的是 2.27.0)更友好,实际命令显示在“git status”期间。例如,如果您删除了文件 tf.c,那么

$ git status
...
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
      deleted:    tf.c

您将使用“git restore tf.c”将其取回,因为它是saz。不用再找了!

于 2020-08-13T17:44:41.610 回答
2

对我来说有效的是git checkout {SHA1 of commit with version to restore} "{path to file to restore}"

例如git checkout 5a6b3179e58edff9c90326b9a04284b02fd67bd0 "src-ui/views/includes/radar.pug"

(在我们希望文件进入的分支中执行)

该命令执行后,恢复的文件将存在于原始位置(需要commited)

于 2016-06-08T13:44:14.277 回答
2

1.找到您要恢复的特定提交:

   git log
This command will give you a list of commits done by you .

2.使用以下命令恢复到该提交:

    git revert <commit id> 

现在您的本地分支将特别包含所有文件

于 2017-03-09T12:22:18.840 回答
1

如果您已经安装了 ToroiseGIT,那么只需为父文件夹弹出菜单选择“Revert...”菜单项。

于 2014-12-07T16:12:26.113 回答
1

注意:首先提交您希望保留的任何工作。

您可以重置您的工作区(并恢复已删除的文件)

git checkout ./*
于 2018-04-11T20:58:30.330 回答
1

这对我来说是最简单的方法:

git checkout HEAD~1 path/to/myfile.rb

我在这里找到了。


另一种对我也有用的方法:

git reset HEAD path/to/myfile.rb
git restore path/to/myfile.rb
于 2020-11-02T21:18:39.427 回答
1

我碰巧将一些 json 文件从一个文件夹移动(而不是复制)到同一个存储库中的另一个文件夹。然后我重命名了这些文件并在新位置更改了一些内容。但是我很快了解到我没有从以前的位置复制并完全删除文件。

简单的解决方案:

git reset HEAD <oldfilepath_which_was_moved>
git restore <oldfilepath_which_was_moved>

对所有文件都这样做了,它们又回来了。

您还可以包含多个以空格分隔的文件。

git reset HEAD file_1_path file_2_path file_3_path

轻松修复,顺便说一句,这不会更改/删除新文件。

于 2022-02-28T22:40:51.170 回答
0

我遇到了同样的问题,但是上述解决方案都不适合我。我最终做的是:
- 创建一个同名的空文件
- 将此文件与其本地历史记录进行比较
- 将历史记录复制到空文件。

于 2016-12-05T09:32:05.323 回答
-1

我遇到了同样的问题,我在这里尝试的答案也没有对我有用。我正在使用 Intellij,并且我检查了一个新分支git checkout -b minimalExample,通过删除一堆文件并修改项目中的一堆其他文件,在某个问题的新分支上创建一个“最小示例”。不幸的是,即使我没有在新的“最小示例”分支上提交任何更改,当我再次检查“原始”分支时,“最小示例”分支中的所有更改和删除都发生在“原来的”分支(或者它出现了)。根据git status删除的文件刚刚从两个分支中消失。

幸运的是,即使 Intellij 警告我“删除这些文件可能无法完全恢复”,我还是能够通过右键单击项目并选择本地历史来恢复它们(在实际删除它们的最小示例分支上) > 显示历史记录(然后在我想要的最近的历史记录项上恢复)。在 Intellij 恢复“最小示例”分支中的文件后,我将分支推送到原点。然后我切换回我的“原始”本地分支并跑到git pull origin minimalExample让他们回到“原始”分支。

于 2020-01-15T22:22:02.480 回答