协慌网

登录 贡献 社区

在 Git 存储库中查找并恢复已删除的文件

说我在 Git 存储库中。我删除了一个文件并提交了更改。我继续工作,并做了一些更多的提交。然后,我发现我需要恢复该文件。

我知道我可以使用git checkout HEAD^ foo.bar签出文件,但我真的不知道该文件何时被删除。

  1. 找到删除给定文件名的提交的最快方法是什么?
  2. 将该文件恢复到我的工作副本的最简单方法是什么?

我希望我不必手动浏览我的日志,检查整个项目的给定 SHA,然后手动将该文件复制到我的原始项目结帐中。

答案

查找影响给定路径的最后一次提交。由于该文件不在 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"
  1. 使用git log --diff-filter=D --summary来获取已删除文件和删除文件的所有提交;
  2. 使用git checkout $commit~1 filename恢复已删除的文件。

其中$commit是您在步骤 1 中找到的提交值,例如e4cf499627

要还原文件夹中的所有已删除文件,请输入以下命令。

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