我删除了一些文件。

我还没有承诺。

我想重置我的工作空间来恢复文件。

我做了一个git结帐。

但被删除的文件还是不见了。

git状态显示:

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

为什么不结帐。将工作空间重置为HEAD?


当前回答

由于您正在执行git签出,看起来您正在尝试将分支恢复到上次提交状态。

你可以通过git重置HEAD来实现这一点——很难

警告

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

其他回答

如果你想一次性恢复所有文件

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

这个命令将重置头部并取消所有的更改:

$ git reset HEAD . 

然后运行该命令恢复所有文件:

$ git checkout .

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

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

自动地一次性恢复所有未分级的删除,而不指定每一个路径:

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

自动地一次性恢复所有的阶段性删除,而不指定每一个路径:

git status | grep 'deleted:' | awk '{print $2}' | xargs git checkout --

以下是不同的案例,供大家参考:

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

$ 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"

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

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

我在这里找到的。


另一种方法也适用于我:

git reset HEAD path/to/myfile.rb
git restore path/to/myfile.rb

使用git ls-files签出删除(-d)或修改(-m)的文件。

git checkout $(git ls-files -d)

参见如何仅恢复git签出上修改的文件?