恢复意外丢弃的未提交文件

时间:2017-06-20 08:34:22

标签: git

我不小心丢弃了所有未提交的更改。我做了git reflog show

f1bb72c HEAD@{0}: discard: [1d5f4f1a481165c24a46addbef7d74a5de3ff9c6]

我该如何恢复?

3 个答案:

答案 0 :(得分:0)

如果文件根本没有添加到Git (如果你没有git add),那么Git根本不知道这些文件。所以你将无法复活它们。

如果您将文件添加到Git 但意外删除了它们并将索引更新为目录的当前状态,您将很难找到您的文件。问题是 - 当文件在Git中时,你当前的历史记录中没有对它们的引用,你所拥有的只是压缩的git对象的数量。

但如果这些文件对你来说太珍贵了,我会这样做:

  • 查找.git/objects目录中现在创建的所有文件以及添加它们时的某个已知日期(忽略infopack dirs)。
  • 浏览每个git对象(连接目录的2个符号和文件的38个符号)并执行git cat -p [hash]直到找到bl​​ob。如果您记住这些文件中的一些独特单词,则可以使用grep

答案 1 :(得分:0)

如果您没有提交暂存隐藏您所做的更改,则无法恢复这些更改。< / p>

编辑:恢复丢失的更改。在Mark Longair's建议上添加此内容(在评论中)。这还包括他在下面的答案(*)中的几个SO链接,我发现它非常有用。

  • 如果您曾经提交某些更改并且丢失了该提交(例如提交处于分离状态),您可以使用reflog找到该提交。请参阅此SO question *。

  • 如果您丢失了最后一次暂存,则还可以恢复。见SO question *。 (我自己从未使用或尝试过。)

  • 如果您有藏匿更改,您还可以使用popapply进行恢复。 (我不确定弹出/丢弃的藏匿处是否也可以恢复,但未提交)。您可能会发现此Recover dropped stash in git有用。

如果还有其他人可以推荐的其他方法,我会进一步编辑此答案以添加它们。

答案 2 :(得分:0)

基于@Stanislav Bashkyrtsev 的回答,我可以提出以下命令行。

遍历所有 git 对象并搜索包含我的文件的所有 git-tree 条目

for /F %A in ('dir /b .git\objects\* ') do for /F %B in ('dir /b .git\objects\%A\*') do (git cat-file tree %A%B | findstr <MY_FILENAME> ) && echo %A%B >> found.txt

found.txt 的内容

18421274e7fd0938bae3f5132ac7779cbd22b21f 
44b488f6f30042cbbd7675419461afda234260a0 
650552061edc4907a9e5983afadba1f8e61b9687 

然后我用 git cat-file -p <TREE_HASH> 检查每个条目并找到带有文件内容的 blob 哈希

λ git cat-file -p 18421274e7fd0938bae3f5132ac7779cbd22b21f
100644 blob a108783cf61693824e9b62d16211cad1e85f68d0    Components.xml
100644 blob d1329eb64792abdbd919b9b7336e0feaa9452a87    TS_ButtonItem.dgx
100644 blob ce9c4fbd5c32f2691c8d15b90b9416c3e1afeb2c    TS_ButtonItemBase.dgx
100644 blob 0cc665b0fa8cdcc7c5ce4f51e4c47f9ca540c72d    TS_CheckBox.dgx
100644 blob f696ad9bb7ec7b963593ea8fded4fe8acd0167c9    TS_IconButtonItem.dgx

之后再次git cat-file -p <BLOB_HASH>并检查文件的内容