2014-01-17 65 views
2

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

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

+0

的可能重复的[撤消GIT中的复位 - 硬](http://stackoverflow.com/questions/7374069/undo-git-reset-hard) –

回答

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 

这表明斑点46ff0854663aeb2182b9838c8da68e33ac23bc1e最初加入file1.txt。但是,很可能您没有将树添加到对象数据库中,您需要检查每个文件以确定要保存的位置。

您可以使用git cat-file命令获取blob的内容。例如,将其保存到recovered.bak

% git cat-file blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e > recovered.bak 
+0

我想'git add'只将文件添加到索引,并且它需要'git commit'来使索引中的文件被添加到对象数据库中。 –

+0

哇!它工作得很好!非常感谢您的快速和伟大的答案! – user1354743

+1

@WayneConrad将一个blob添加到索引将继续并将其放入对象数据库以及索引。这些类型的情况非常方便,因此您可以在修改工作目录后检出索引。 –