git add + git reset硬删除工作拷贝文件

我已经添加了一个目录与git add,并意识到它有错误的文件,所以我用git reset --hard回到最新的提交,但我不知道git也会删除那些在工作中添加的文件复制。

有谁知道我如何解决这个问题?


当你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
链接地址: http://www.djcxy.com/p/4027.html

上一篇: git add + git reset hard deleted working copy file

下一篇: Restore files removed by Git checkout