恢复一次暂存但未提交的文件?

时间:2015-05-01 14:11:37

标签: git

我已经在现有项目中初始化了git repo,暂存了所有文件,然后没有做出初始提交决定清理索引。不知道为什么我认为这是一个好主意,但我立刻输入了git reset --hard(我现在无法说出我的想法,也许是几个不眠之夜造成的损失)。现在所有文件都消失了......

是否有可能至少恢复其中的一部分?我看到在.git/objects/中注册了对象。

1 个答案:

答案 0 :(得分:2)

如果您在git add之前执行了git reset暂存文件,那么所有文件和描述目录层次结构的树对象都在对象数据库.git/objects中,除非垃圾收集已经足够长,或者你自己运行git gc之类的东西。然而,重构事物需要花费一些工作 - git没有预先打包内置的这个功能。这里有一些提示:

  1. 对数据库中的每个对象使用git cat-file -t HASH以标识每个对象的类型。寻找那些树对象。请注意,对象哈希值将被拆分以命名.git/objects中的文件。因此,具有散列“db6689df4f8aae84d35df2e496158b2746bb0f1e”的对象实际存储在.git/objects/db/6689df4f8aae84d35df2e496158b2746bb0f1e,前两个字符用作子目录 - 您可以轻松地重建对象哈希值。如果您在.git/objects/pack中有文件,则可能需要另外运行git verify-pack -v .git/objects/pack/pack-HASH.pack以获取每个包文件中包含的对象列表。
  2. 对于每个树对象,使用git cat-file -p HASH查找文件的原始文件名和哈希值(也称为“blob”)。其中一棵树将匹配工作目录的根目录。一旦确定了根树对象,就可以
  3. 运行git ls-tree -r HASH以获取所有文件名及其各自哈希值的完整列表。
  4. 对于要从上面的列表中恢复的每个文件,您可以运行git show HASH > FILENAME来重新创建文件 - 您需要手动创建子目录,但首先。
  5. 有了这些信息,编写一个可以为您完成繁重工作的脚本应该不会太困难。祝你好运!

    编辑:或者,一旦您确定了根树对象,您就可以简单地echo "commit for recovery" | git commit-tree HASH,它将创建一个提交并向您报告该新提交的哈希值。然后,您可以git checkout HASH将文件恢复到工作目录中,并git branch BRANCHNAME创建指向该提交的分支。如果您的git tar-tree版本足够长,或git,您也可以查看git archive