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

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

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


当前回答

查找影响给定路径的最后一次提交。由于该文件不在HEAD提交中,因此前一次提交必须已将其删除。

git rev-list -n 1 HEAD -- <file_path>

然后在提交之前使用插入符号(^)签出版本:

git checkout <deleting_commit>^ -- <file_path>

或者在一个命令中,如果$file是有问题的文件。

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

如果使用zsh并启用EXTENDED_GLOB选项,则插入符号将不起作用。您可以改用~1。

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

其他回答

这是我发现的最简单的解决方案,如果您只想在master中恢复相同的文件:

git checkout master -- path/to/File.java

要获得最佳方法,请尝试。


首先,找到删除文件的提交的提交id。它将为您提供已删除文件的提交摘要。

git-log--diff-filter=D--摘要git校验84sdhfddbdddf~1

注意:84sdhfddbddd是您的提交id

通过此操作,您可以轻松恢复所有已删除的文件。

您总是可以git还原删除文件的提交。(这假设删除是提交中唯一的更改。)

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

如果您继续工作,并且后来意识到您不想提交删除提交,则可以使用以下方法进行恢复:

> git revert 2994bd

现在git日志显示:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

readme.md已恢复到存储库中。

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

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

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

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

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

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

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

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清除。我需要恢复这些文件,但随后又将其拆下。我有数百个文件要恢复,像其他示例中那样手动为每个文件键入内容太慢了。