假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
$ git log --diff-filter=D --summary | grep "delete" | sort
其他回答
如果尚未提交删除,下面的命令将在工作树中恢复已删除的文件。
$ git checkout -- <file>
您可以使用下面的命令获取工作树中所有已删除文件的列表。
$ git ls-files --deleted
如果已提交删除,请找到发生删除的位置,然后从此提交中恢复文件。
$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>
如果您正在查找要恢复的文件路径,以下命令将显示所有已删除文件的摘要。
$ git log --diff-filter=D --summary
我必须从一个特定的提交中恢复一堆已删除的文件,我用两个命令进行管理:
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 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
优点:以下方法确实适用于文件/文件夹甚至从垃圾箱或回收站删除的情况。
文件/文件夹已从工作树中删除,但尚未提交:
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
要获得最佳方法,请尝试。
首先,找到删除文件的提交的提交id。它将为您提供已删除文件的提交摘要。
git-log--diff-filter=D--摘要git校验84sdhfddbdddf~1
注意:84sdhfddbddd是您的提交id
通过此操作,您可以轻松恢复所有已删除的文件。