假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。
我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。
如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?
当前回答
如果您知道文件名,这是使用基本命令的简单方法:
列出该文件的所有提交。
git log -- path/to/file
最后一次提交(最顶层)是删除文件的提交。因此,您需要恢复倒数第二次提交。
git checkout {second to last commit} -- path/to/file
其他回答
我最喜欢的别名,基于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\""
我有这个解决方案。
使用以下方法之一获取删除文件的提交id。git-log--grep=*word*git-log-剑git-log|grep--context=5*word*git-log--stat|grep--context=5*word*#建议您记住任何事情您应该得到以下内容:
提交bfe68bd117e1091c96d2976c99b3bcc8310bebe7作者:Alexander奥尔洛夫日期:2011年5月12日星期四23:44:27+0200替换了已弃用的GWT类-gwtI18nKeySync.sh,一个过时的(?,被Maven目标取代)I18n生成脚本提交3ea4e3af253ac6fd1691f6bb89c964f54802302作者:Alexander奥尔洛夫日期:2011年5月12日星期四22:10:22+0200
3.现在使用提交id bfe68bd117e1091c96d2976c99b3bcc8310bebe7执行以下操作:
git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java
由于提交id引用了文件已被删除的提交,您需要引用bfe68b之前的提交,可以通过添加^1来完成。这意味着:在bfe68b之前提交给我。
为了使用Git恢复所有删除的文件,您还可以执行以下操作:
git checkout $(git ls-files --deleted)
其中git-ls-files-deleted列出了所有删除的文件,gitcheckout$(git命令)在参数中恢复文件列表。
如果尚未提交删除,下面的命令将在工作树中恢复已删除的文件。
$ 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还原删除文件的提交。(这假设删除是提交中唯一的更改。)
> 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已恢复到存储库中。