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

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

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


当前回答

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

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

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 

假设您找到$commitid 1234567…,然后

git checkout <$commitid> $fileName

这将还原该提交中的文件版本。

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

列出悬空提交

git fsck—找到丢失

检查每个悬空提交

git reset--hard<commit id>

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

git状态,原因如下:

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

优点:以下方法确实适用于文件/文件夹甚至从垃圾箱或回收站删除的情况。

文件/文件夹已从工作树中删除,但尚未提交:

I.如果您尚未对更改进行索引(gitadd),则可以还原目录的内容:

git restore--路径/to/folder_OR_file

二、如果删除已被索引,则应首先重置:

git reset—路径/to/folder_OR_file

然后执行,git restore path/to/folder_OR_file

文件/文件夹在过去的某些提交中被删除:

使用git-log--diff-filter=D--summary获取删除文件/文件夹的提交的详细信息;使用gitcheckout$commit~1path/to/folder_OR_file还原删除的文件/文件夹。其中$commit是您在步骤1中找到的提交的sha值,例如c7578994

获取已删除文件的所有提交以及已删除的文件:git-log--diff-filter=D--摘要记下所需的提交散列,例如e4e6d4d5e5c59c69f3bd7be2。将删除的文件从之前的一次提交(~1)还原到上面确定的提交(e4e6d4d5e5c59c69f3bd7be2):git签出e4e6d4d5e5c59c69f3bd7be2~1路径/to/file.ext注意~1。

查找删除文件的提交:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

样本输出:

4711174

从Git 2.23开始,实际上有一个restore命令。它仍然是实验性的,但为了恢复您在提交中删除的内容(在本例中为4711174),您可以键入:

git restore --source=4711174^ path/to/file

注意提交id之后的^,因为我们希望从删除文件之前的提交中恢复一些内容。

--source参数告诉restore命令在哪里查找要还原的文件,它可以是任何提交,甚至可以是索引。

参见:git 2.23.0的git restore doc