意外地恢复为主文件,丢失了未提交的更改[关闭]


73

我已经设法犯了一个大错误(在一个星期一早晨),在Master上工作,忘记创建新分支,对文件进行更改,然后无意中将其还原到Master,失去了所有更新。我没有提交更新的文件。

我丢失了所有更新还是可以找回它们?

不要问我怎么做,因为每次我想起来我都要面对自己。


在下面的评论中,您提到能够通过存储通过GitHub GUI自动保存的存储来恢复工作。我还没有看到GUI的实际作用,并且一直担心丢失东西,想知道警告消息的样子等。您可以编辑问题以澄清实际发生的事情,以便我们所有人都能从中受益吗?
nealmcb 2012年

1
这个问题应该重新讨论。它包含足够的信息(无需提交即可还原)来回答问题(我可以告诉我)。
rubenvb

3
尊敬的管理员,在将此类问题标记为“已结束”时,看来是官僚作风。公认的解决方案提供了大量信息,这是任何人都可以碰到的极其通用的用例。要求您停止在不必要的情况下严格收紧规则,并为甚至最幼稚的用户提供一定的范围来询问和使用该平台。
Curious Coder'Sep

为什么这个问题是题外话?
旦博士

Answers:


87

如果您尚未提交暂存隐藏所做的更改,则无法恢复这些更改。

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

  • 如果您曾经提交过一些更改而丢失了该提交(例如以分离状态提交),则可以使用来找到该提交reflog。请参阅此SO问题*。

  • 如果您丢失了上一阶段的更改,则也可以恢复。请参阅此SO问题*。(我自己从未使用过或尝试过)。

  • 如果你已经藏匿的变化,你也可以使用恢复popapply。(我不确定弹出/删除的隐藏文件是否也可以恢复,但未提交)。您可能会在git中发现此恢复丢弃的存储很有用。

如果有人可以建议其他方法,我将进一步编辑此答案以添加它们。


3
您的stash提示使我找到了正确的做法。确实非常感谢
Trist

2
您可能需要编辑答案以指出,如果仅暂存了文件,您也可以取回文件,因为该操作仍将文件放入了对象数据库中。(请参阅我的回答的第二段。)
马克·朗伊尔

在恢复丢失的更改时增加了几点。
Sailesh

7
一些IDE完全独立于源代码控制来跟踪本地文件历史记录。
Konrad Morawski

1
如果您正在处理一个Web项目,并且碰巧在浏览器中加载了有问题的文件,则该文件的副本可能仍在缓存中可用(不要重新加载该页面,否则会丢失它!)以这种方式恢复丢失的文件。见sensefulsolutions.com/2012/01/...
加多宝还记得莫妮卡

46

两个长镜头:一些IDE(例如Delphi)保留了编辑器历史记录。您可能在那里有追索权。
接下来,如果您的本地工作目录位于MyDocuments文件夹中,则它可能已经由Windows Home Server,Carbonite,MozyPro等自动备份了。这些通常是“设置后忘记了”。也许你忘了吗?


10
Eclipse将此功能称为“本地历史记录”。您甚至还可以恢复尚未暂存,隐藏或提交的文件。
Mikko Rantalainen

1
谢谢您将这个想法付诸实践!!我能够在Dropbox网络界面中恢复“已删除”文件!你救了我的培根。在保管箱中恢复已删除的文件
lyonsinbeta 2014年

4
我在Eclipse上犯了同样的愚蠢错误。我在未显示任何历史记录的更改文件上单击鼠标右键->“从本地历史记录还原...”。但是当我右键单击->替换为->本地历史记录时...我看到了更改列表。那救了我。希望这对某人有帮助。
Rahul Dabas 2014年

4
谢谢您的回答!!!!我永远感谢您的回答。PHPStorm具有独立于Git的单个文件的VCS->本地历史记录。我之前犯了一个非常愚蠢的错误,导致我未提交的更改丢失了。这是大约三天的工作。非常感谢!!!!!!!!!!!!!!!!!!!!!
theGreenCabbage 2015年

2
我几乎要哭了,感谢eclipse ide,您的回答救了我一命:D
Freelancer

19

我陷入同样的​​境地。

在--hard重置之前,在终端中有一个已更改文件的列表,进入我的编辑器(Sublime 2,没关系),打开每个文件并按cmd + z(撤消)一次,这实际上撤消了更改通过硬重置完成,我退回了未提交的更改:)


在VS Code中,同样适用于我。
主教

1
你是男人!
Renato Sanhueza

10

此处的关键问题是对文件进行更改后的操作。如果创建的提交包含文件的新状态,则应该能够通过查看中的最新条目git reflog,找到提交的SHA1sum并使用git branch recovered <SHA1sum>或类似内容从中创建一个新分支来找回它们。在此答案中有一个执行此操作的示例。

如果您git add对任何文件进行了登台,也应该可以将它们取回,但这是更多工作-Jakub在此答案中描述了如何执行此操作。

如果您碰巧git stash要给自己一个干净的状态,那么您当然可以像其他藏家一样找回它。

否则,恐怕这个消息不好。

我希望事后指出这一点不会令人感到恼火,但只要切换回master分支,您就不必使用任何可能会丢失数据的命令-git checkout master会告诉您您已经在master分支上,并显示所有未提交的更改。(git reset --hard考虑到^W我以这种方式丢失数据的人的频率,可以说有一个“是的,我的意思是真的”确认是否存在未提交的更改。)


bash命令行什么时候没有问我什么git reset --hard HEAD~1。所有未进行的未提交的更改都消失了。无话可问。
罗伯特·科里特尼克'17

2
@RobertKoritnik我想您可能误解了我回答的最后一句话-我是说“您确定吗?” 确认何时git reset --hard可能丢失数据将是一个很好的功能,而不是git那样做。
Mark Longair '17

3

使用引用日志。git reflog将按时间顺序显示您已进行的所有提交的历史记录。

如果您由于“签出主人”而丢失了更改,那么您可能就没事了。 git status会告诉您是否没有头工作。(也是如此git branch)。

无头工作并不是那么糟糕(我一直在故意这样做),但是您将更加依赖reflog。

但是,如果您没有提交更改,则无法检索这些文件。发生这种情况的唯一现实方法是,如果您进行了硬重置,或明确地强制了结帐。千万不能强行改变,除非你确信你是舒服丢失数据。

通常,在git中,通过指定来执行“强制” -f


感谢您的快速回复,无法在reflog中找到ref,但是很有可能我做错了。使用GitX并找到一个藏匿处,将其弹出。
特里斯特

1

不幸的是,我做了同样的事情,不止一次。如果不提交任何内容,git不会知道您写了什么。即使您确实提交了,然后向后退时,我也不确定反射是否会有所帮助。


1
感谢您的快速回复,我一直在尝试GitHub GUI,在生产环境中做一些愚蠢的事情,但是您就可以了。在我造成损害之前,它似乎进行了<stash> stash </ code>。
特里斯特

很高兴听到您比我幸运:)
matthewdaniel

@Trist This is what did it for me. I was about to curse GitHub for making it so easy to switch branch without committing (and no visible stash function in the GUI) when I saw your comment. git stash apply saved the day.
John
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.