我添加了一个带git add的目录,并意识到其中有错误的文件,所以我使用git reset --hard返回到最新的提交,但我不知道git也会删除那些添加的文件在工作副本中。
有谁知道我如何撤消这个?
答案 0 :(得分:4)
当您git add
文件时,它会被添加到对象数据库和索引中。运行git reset
更新了索引和工作目录,但它没有从对象数据库中删除这些文件。它们仍然是无根(“悬空”)物体。您可以运行git文件系统检查器git fsck
以查看哪些项目是“悬空”。您应该看到如下报告:
% git fsck
dangling blob 1ff0c423042b46cb1d617b81efb715defbe8054d
dangling blob 1bc915c5cb7185a9438de28a7b1a7dfe8c01ee7f
dangling blob a8c86221b400b836010567cc3593db6e96c1a83a
dangling blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e
dangling blob 21a96a98ed84d45866e1de6e266fd3a61a4ae9dc
... etc ...
如果您碰巧有一个悬空树,您可以将文件名恢复为blob ID映射。如果你有一些悬垂的树:
dangling tree 57623d711c18d819831f24a9456f0660e9dbe596
然后,您可以通过运行git ls-tree
命令显示树内容:
% git ls-tree 57623d711c18d819831f24a9456f0660e9dbe596
100644 blob 21a96a98ed84d45866e1de6e266fd3a61a4ae9dc file1.txt
100644 blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e file2.txt
这表示blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e
最初添加为file1.txt
。但是,很可能您没有将树添加到对象数据库中,您需要检查每个文件以确定要保存它的位置。
您可以使用git cat-file
命令获取blob的内容。例如,要将其保存到recovered.bak
:
% git cat-file blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e > recovered.bak