在Git存储库中查找并恢复已删除的文件

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

我知道我可以使用git checkout HEAD^ foo.bar来签出文件,但是我真的不知道何时删除该文件。

  1. 找到删除给定文件名的提交的最快方法是什么?
  2. 将文件恢复到我的工作副本中最简单的方法是什么?

我希望我不必手动浏览日志,签出给定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楼

基于<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值