假设我在Git存储库中。 我删除文件并提交更改。 我继续工作并做出更多承诺。 然后,我发现需要还原该文件。
我知道我可以使用git checkout HEAD^ foo.bar
来签出文件,但是我真的不知道何时删除该文件。
- 找到删除给定文件名的提交的最快方法是什么?
- 将文件恢复到我的工作副本中最简单的方法是什么?
我希望我不必手动浏览日志,签出给定SHA的整个项目,然后手动将该文件复制到我的原始项目签出中。
#1楼
查找影响给定路径的最后一次提交。 由于该文件不在HEAD提交中,因此此提交必须已将其删除。
git rev-list -n 1 HEAD -- <file_path>
然后使用尖号( ^
)符号在提交之前检出版本:
git checkout <deleting_commit>^ -- <file_path>
或者在一个命令中,如果$file
是有问题的文件。
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
如果您正在使用zsh并启用了EXTENDED_GLOB选项,则插入符号将不起作用。 您可以改用~1
。
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
#2楼
在我们的案例中,我们意外地删除了一次提交中的文件,而在某些提交之后,我们意识到了自己的错误,想取回所有已删除的文件,而不是找回那些已修改的文件。
基于Charles Bailey的出色回答,这是我的一线笔:
git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
#3楼
要恢复已删除并提交的文件:
git reset HEAD some/path
git checkout -- some/path
它已在Git 1.7.5.4版上进行了测试。
#4楼
在许多情况下,将coreutils (grep,sed等)与Git结合使用可能会很有用。 我已经很好地了解了这些工具,但是Git不太了解。 如果要搜索已删除的文件,请执行以下操作:
git log --raw | grep -B 30 $'D\t.*deleted_file.c'
当我找到修订/提交时:
git checkout <rev>^ -- path/to/refound/deleted_file.c
就像其他人在我面前说过的一样。
现在,文件将恢复到删除前的状态。 如果要保留它,请记住将其重新提交到工作树中。
#5楼
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
#6楼
基于<