我尝试了来自git reset --hard HEAD@{n}
的git reflog
,我用我目前的未分段文件丢失了所有内容:'(
未分阶段的文件是我做的最后一个git add
,之前我尝试了git reset
到最后一个git commit
。
我的所有文件都没了,我不能在最后一次提交之前回到git add
:'(
目前尚不清楚您是否丢失了工作目录中的文件或索引中的文件。你说你丢失了“未分级文件”,但是你提到你可能已经运行了“git add”。 “未分级文件”永远丢失了。
可以使用恢复分段文件
git fsck --full --unreachable --no-reflog
对于添加的每个文件,将存在丢失的blob对象,并且对于每个目录条目,将存在树对象。您可以通过执行来恢复文件更改
git cat-file -p SHA
对于您修改过的每个文件
(master)$ vi bar
(master)$ vi baz
(master)$ vi foo
(master)$ git add foo bar baz
(master)$ git reset --hard HEAD
HEAD is now at ead8fa2 initial
(master)$ git fsck --full --unreachable --no-reflog
Checking object directories: 100% (256/256), done.
unreachable blob 0c29287001b29159f11c4e8a320bce7e9789c00b
unreachable blob 1524d3478e3d0b92866a53239b10bcd4b3838c4d
unreachable blob 97b724e770249816c61d8a526415986208ed7e15
// take a look at one of the objects
(master)git cat-file -p 0c29287001b29159f11c4e8a320bce7e9789c00b
changes for bar
//Here, based on inspecting the output, I can determine that 0c29287 was the file "bar"
(master) git cat-file -p 0c29287 > bar
(注意我测试时没有丢失任何树木,所以这部分可能无效)
如果您修改了一大堆文件,则可能更容易通过树对象而不是单个文件进行恢复
git read-tree SHA
其中SHA是根树的丢失树对象。
所有暂存/未提交的文件都将使用git reset --hard删除
建议不要使用--hard,因为该选项会删除所有未暂存/未提交的文件,而应首先存储然后使用正常重置
代替
git reset --hard HEAD@{n}
你应该做
git stash
git reset HEAD@{n}
然后,您的代码将保存在存储堆栈中,您可以通过执行操作再次检索它
git stash pop
虽然此命令将“stashed”更改与其当前HEAD(存储类似分支实现)合并,但建议在生成这些stashes的相同提交上执行stash检索
如果您使用git add
暂存文件,仍然可以找回它。但如果文件没有上演,我不得不说没有办法。 :(
请记住,git reset
确实不安全,特别是对于未分段的文件。
但是如果文件真的非常重要,我能想到的是你可能会停止修改磁盘中的任何数据,并尝试使用finaldata
等工具进行磁盘恢复。如果幸运的话,它可能会找回一些东西,因为你已经在git reset
之后覆盖了一些文件。
无论如何,如果你熟悉它,Git
真的是一个强大而酷的工具。
低技术提示可能对某些人有用。如果您丢失了未分段/未分配的文件,则在编辑器中打开。尝试对该文件执行撤消操作,您应该从编辑器历史堆栈中获取该文件的“先前版本”。
与UsamaAmjad和Juank的回答相似。
如果您使用了足够好的IDE / Editor:
笔记: