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

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

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


当前回答

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

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

其他回答

如果删除了最新HEAD提交中存在的文件,则可以使用以下方法恢复该文件:

git checkout HEAD -- path/to/file.ext

在我们的案例中,我们在一次提交中意外删除了文件,而在一些提交之后,我们意识到了自己的错误,想要取回所有被删除的文件,而不是那些被修改的文件。

根据查尔斯·贝利的出色回答,以下是我的一句话:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

如果您知道删除文件的提交,请运行以下命令:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~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 checkout

输出

D       index.html

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

git restore index.html

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

git restore .

参见Gif图像