假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。

我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。

如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?


当前回答

git checkout /path/to/deleted.file

其他回答

为了使用Git恢复所有删除的文件,您还可以执行以下操作:

git checkout $(git ls-files --deleted)

其中git-ls-files-deleted列出了所有删除的文件,gitcheckout$(git命令)在参数中恢复文件列表。

我最喜欢的别名,基于bonyiii的答案(已投票),以及我自己关于“向Git别名命令传递参数”的答案:

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

我丢失了一个文件,几次提交前被错误删除了?快速:

git restore my_deleted_file

危机得以避免。

警告:Git 2.23(2019年第3季度)带来了名为Git restore(!)的实验命令。因此,请重命名此别名(如下所示)。


罗伯特·戴利在评论中提出了以下别名:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

杰根在评论中补充道:

为了从命令行设置别名,我使用了以下命令:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

我必须从一个特定的提交中恢复一堆已删除的文件,我用两个命令进行管理:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(注意每个命令末尾的尾随空格。)

这些文件已添加到.gitignore文件中,然后用gitrm清除。我需要恢复这些文件,但随后又将其拆下。我有数百个文件要恢复,像其他示例中那样手动为每个文件键入内容太慢了。

实际上,这个问题直接与Git有关,但像我这样的人除了了解Git CLI命令之外,还使用诸如WebStorm VCS之类的GUI工具。

我右键单击包含已删除文件的路径,然后转到Git,然后单击Show History。

VCS工具显示了所有的修订序列,我可以看到它们的所有提交和更改。

然后我选择我的朋友删除PostAd.js文件的提交。现在参见下文:

现在,我可以看到我希望删除的文件。我只需双击文件名,它就会恢复。

我知道我的答案不是Git命令,但对于初学者和专业开发人员来说,它是快速、可靠和容易的。WebStorm VCS工具非常棒,非常适合使用Git,而且不需要任何其他插件或工具。

您可以签出已删除的文件:

git checkout

输出

D       index.html

要恢复它,请执行以下操作:

git restore index.html

如果您删除了多个文件,并且需要恢复所有使用:

git restore .

参见Gif图像