假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
为了使用Git恢复所有删除的文件,您还可以执行以下操作:
git checkout $(git ls-files --deleted)
其中git-ls-files-deleted列出了所有删除的文件,gitcheckout$(git命令)在参数中恢复文件列表。
其他回答
要获得最佳方法,请尝试。
首先,找到删除文件的提交的提交id。它将为您提供已删除文件的提交摘要。
git-log--diff-filter=D--摘要git校验84sdhfddbdddf~1
注意:84sdhfddbddd是您的提交id
通过此操作,您可以轻松恢复所有已删除的文件。
如果你疯了,用二分法。下面是要做的:
git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>
现在是运行自动测试的时候了。如果foo.bar存在,shell命令“[-e foo.bar]”将返回0,否则返回1。git平分的“run”命令将使用二进制搜索自动查找测试失败的第一个提交。它从给定范围的一半开始(从好到坏),并根据指定测试的结果将其减半。
git bisect run '[ -e foo.bar ]'
现在,您在提交时删除了它。从这里,您可以跳回到未来并使用git-restore撤消更改,
git bisect reset
git revert <the offending commit>
或者您可以返回一次提交并手动检查损坏:
git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
要还原文件夹中的所有已删除文件,请执行以下操作:
git ls-files -d | xargs git checkout --
查找删除文件的提交:
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
如果删除了最新HEAD提交中存在的文件,则可以使用以下方法恢复该文件:
git checkout HEAD -- path/to/file.ext