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

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

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


当前回答

要获得最佳方法,请尝试。


首先,找到删除文件的提交的提交id。它将为您提供已删除文件的提交摘要。

git-log--diff-filter=D--摘要git校验84sdhfddbdddf~1

注意:84sdhfddbddd是您的提交id

通过此操作,您可以轻松恢复所有已删除的文件。

其他回答

如果您知道删除文件的提交,请运行以下命令:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

管道之前的部分列出了提交中删除的所有文件;它们都是从上一次提交中签出以恢复它们。

我必须从一个特定的提交中恢复一堆已删除的文件,我用两个命令进行管理:

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 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 .

我最喜欢的别名,基于bonyiii的答案(已投票),以及我自己关于“向Git别名命令传递参数”的答案:

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

我丢失了一个文件,几次提交前被错误删除了?快速:

git restore my_deleted_file

危机得以避免。

警告:Git 2.23(2019年第3季度)带来了名为Git restore(!)的实验命令。因此,请重命名此别名(如下所示)。


罗伯特·戴利在评论中提出了以下别名:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

杰根在评论中补充道:

为了从命令行设置别名,我使用了以下命令:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

如果尚未提交删除,下面的命令将在工作树中恢复已删除的文件。

$ git checkout -- <file>

您可以使用下面的命令获取工作树中所有已删除文件的列表。

$ git ls-files --deleted

如果已提交删除,请找到发生删除的位置,然后从此提交中恢复文件。

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

如果您正在查找要恢复的文件路径,以下命令将显示所有已删除文件的摘要。

$ git log --diff-filter=D --summary