通常情况下,你可以这样做:
$ echo "Stanley, you must beware of the Drive bee" > file-a
$ echo "What's a Drive bee?" > file-b
$ git init .
$ git add file-b
$ git commit file-b -m "We don't know, but whatever error you make with it could be fatal."
$ git reset --hard HEAD
$ ls
file-a file-b
我认为我做得非常糟糕:
$ echo "What are you doing, you darn ?" > file-a
$ echo "Can't you see I'm trying to drive?" > file-
$ git init .
$ git add -A
$ git commit file- -m "Oh, my God! [It's] the Drive !"
$ git reset --hard HEAD
$ ls
file-
结果:所有已暂存但未提交的文件已删除0_o
git reset --hard HEAD\^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
我有什么办法可以恢复刚刚删除的文件吗?换句话说,是否可以将git存储库恢复到发出git add -A
命令之前(或何时)的条件?
答案 0 :(得分:20)
是的,你真的很幸运。你在某种程度上添加了Git的索引。实际上,当Git添加到索引时,它确实为每个文件创建了blob对象。索引本身只存储树对象。
所以是的,为您的分阶段文件创建了blob对象。您丢失的只是树信息,即路径和文件名,但您可以恢复内容。
尝试运行git fsck
,你应该得到一个悬空blob列表:
Checking object directories: 100% (256/256), done.
dangling blob ac28af8d84fc71eb247ccf665c6d0f4bf1822520
dangling blob 2d152ff9f09cb08ebc495f453da63eddaa9e249f
dangling blob cd9567427762cd8066b4e802e5c170a31a026100
然后,您可以通过执行git cat-file -p ac28af8d
来恢复内容。例如,您可以将其传递给文件:
git cat-file -p ac28af8d > recovered-file
为所有人做这件事,然后让他们回来。
答案 1 :(得分:2)
以下脚本将所有悬空blob从git fsck
输出恢复为文件:
i=0; for x in `git fsck | grep "dangling blob [0-9a-f]" | cut -d ' ' -f 3`; do git cat-file -p $x > /tmp/test${i}; i=$((i+1)) ; done
如您所见,每个原始文件的输出都恢复为通用文件名/ tmp / test $ {i} ...我还没有找到恢复文件名的方法......命令我'我试过的是git ls-tree
:
首先我采取了可能的对象:
./.git/objects/37
./.git/objects/37/5187f5882593f7e52c8efef602d98f1f049c5d
./.git/objects/37/98be05fcbd7c79e08703aead800529b362332b
然后,我尝试执行ls-tree
技巧,但未能将此识别为有效对象。
/<myproj>/.git/objects/37 ]$ git ls-tree 5187f5882593f7e52c8efef602d98f1f049c5d
fatal: Not a valid object name 5187f5882593f7e52c8efef602d98f1f049c5d
答案 2 :(得分:0)
我非常喜欢从answer到相关Stack Overflow问题的以下解决方案:
git log --diff-filter=D --summary
获取已删除文件和删除文件的所有提交git checkout $commit~1 filename
恢复已删除的文件。简洁直观。