我不小心丢弃了所有未提交的更改。我做了git reflog show
。
f1bb72c HEAD@{0}: discard: [1d5f4f1a481165c24a46addbef7d74a5de3ff9c6]
我该如何恢复?
答案 0 :(得分:0)
如果文件根本没有添加到Git (如果你没有git add
),那么Git根本不知道这些文件。所以你将无法复活它们。
如果您将文件添加到Git 但意外删除了它们并将索引更新为目录的当前状态,您将很难找到您的文件。问题是 - 当文件在Git中时,你当前的历史记录中没有对它们的引用,你所拥有的只是压缩的git对象的数量。
但如果这些文件对你来说太珍贵了,我会这样做:
.git/objects
目录中现在创建的所有文件以及添加它们时的某个已知日期(忽略info
和pack
dirs)。git cat -p [hash]
直到找到blob。如果您记住这些文件中的一些独特单词,则可以使用grep
。答案 1 :(得分:0)
如果您没有提交,暂存或隐藏您所做的更改,则无法恢复这些更改。< / p>
编辑:恢复丢失的更改。在Mark Longair's建议上添加此内容(在评论中)。这还包括他在下面的答案(*)中的几个SO链接,我发现它非常有用。
如果您曾经提交某些更改并且丢失了该提交(例如提交处于分离状态),您可以使用reflog
找到该提交。请参阅此SO question *。
如果您丢失了最后一次暂存,则还可以恢复。见SO question *。 (我自己从未使用或尝试过。)
如果您有藏匿更改,您还可以使用pop
或apply
进行恢复。 (我不确定弹出/丢弃的藏匿处是否也可以恢复,但未提交)。您可能会发现此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>
并检查文件的内容