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

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

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


当前回答

如果删除了最新HEAD提交中存在的文件,则可以使用以下方法恢复该文件:

git checkout HEAD -- path/to/file.ext

其他回答

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

要还原文件夹中的所有已删除文件,请执行以下操作:

git ls-files -d | xargs git checkout --

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

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

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

我最喜欢的别名,基于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-log--diff-filter=D--摘要记下所需的提交散列,例如e4e6d4d5e5c59c69f3bd7be2。将删除的文件从之前的一次提交(~1)还原到上面确定的提交(e4e6d4d5e5c59c69f3bd7be2):git签出e4e6d4d5e5c59c69f3bd7be2~1路径/to/file.ext注意~1。