假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
要还原文件夹中的所有已删除文件,请执行以下操作:
git ls-files -d | xargs git checkout --
其他回答
如果你疯了,用二分法。下面是要做的:
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 checkout -- .
但是删除的文件没有返回,只需执行以下命令:
git checkout <file_path>
很快,你的文件回来了。
您总是可以git还原删除文件的提交。(这假设删除是提交中唯一的更改。)
> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date: Thu May 9 11:11:06 2019 -0700
deleted readme.md
如果您继续工作,并且后来意识到您不想提交删除提交,则可以使用以下方法进行恢复:
> git revert 2994bd
现在git日志显示:
> git log
Author: Dave <dave@domain.com>
Date: Thu May 9 11:17:41 2019 -0700
Revert "deleted readme"
This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.
readme.md已恢复到存储库中。
这是我发现的最简单的解决方案,如果您只想在master中恢复相同的文件:
git checkout master -- path/to/File.java
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory
还原删除的文件:
user@bsd:~/work/git$ git checkout
D .slides.tex.swp
D slides.tex
user@bsd:~/work/git$ git checkout slides.tex
user@bsd:~/work/git$ ls slides.tex
slides.tex