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

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

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


当前回答

我也有同样的问题。在不知情的情况下,我创建了一个悬空的承诺。

列出悬空提交

git fsck—找到丢失

检查每个悬空提交

git reset--hard<commit id>

当我移动到悬空提交时,我的文件再次出现。

git状态,原因如下:

“HEAD从<commit id where it detached>分离”

其他回答

要还原文件夹中的所有已删除文件,请执行以下操作:

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

查找影响给定路径的最后一次提交。由于该文件不在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 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 log -- path/to/file

最后一次提交(最顶层)是删除文件的提交。因此,您需要恢复倒数第二次提交。

git checkout {second to last commit} -- path/to/file

要还原已删除并提交的文件,请执行以下操作:

git reset HEAD some/path
git checkout -- some/path

它在Git 1.7.5.4版本上进行了测试。