假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
您总是可以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已恢复到存储库中。
其他回答
如果删除了最新HEAD提交中存在的文件,则可以使用以下方法恢复该文件:
git checkout HEAD -- path/to/file.ext
要还原文件夹中的所有已删除文件,请执行以下操作:
git ls-files -d | xargs git checkout --
如果尚未提交删除,下面的命令将在工作树中恢复已删除的文件。
$ git checkout -- <file>
您可以使用下面的命令获取工作树中所有已删除文件的列表。
$ git ls-files --deleted
如果已提交删除,请找到发生删除的位置,然后从此提交中恢复文件。
$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>
如果您正在查找要恢复的文件路径,以下命令将显示所有已删除文件的摘要。
$ git log --diff-filter=D --summary
查找影响给定路径的最后一次提交。由于该文件不在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"
我必须从一个特定的提交中恢复一堆已删除的文件,我用两个命令进行管理:
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清除。我需要恢复这些文件,但随后又将其拆下。我有数百个文件要恢复,像其他示例中那样手动为每个文件键入内容太慢了。