无意中还原了主人,丢失了未提交的变更

我设法犯了一个大错(周一上午)在Master上工作,忘记创build新的分支,对文件进行了修改,然后无意中还原到了master,失去了所有的更新。 我没有提交更新的文件。

我失去了所有的更新,或者我可以检索他们吗?

不要问我是怎么回事,因为每当我想到这一点时,我都要狠狠地打了个招呼。

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

编辑:恢复丢失的变化。 在Mark Longair的build议(在评论中)加上这一点。 这也包括从他的答案(*)几个SO链接,我发现相当丰富。

  • 如果你曾经犯过一些改变,并且已经失去了这个提交(就像在一个分离的状态下提交),你可以使用reflog来find这个提交。 看到这个问题 *。

  • 如果你失去了上一次改变的阶段 ,你也可以恢复。 看到这个问题 *。 (我从来没有使用过或自己尝试过)。

  • 如果您隐藏了更改,您也可以使用popapply来恢复该更改。 (我不确定popup/丢弃的内存是否也可以恢复,但没有提交)。 你可能会发现这个恢复下降藏在git有用。

如果有任何人可以build议的其他方法,我会进一步编辑这个答案来添加它们。

两个长片:一些IDE,比如Delphi,保留了一个编辑历史。 你可能有一些追索权。
接下来,如果您的本地工作目录位于MyDocuments文件夹中,它可能已经被Windows Home Server,Carbonite,MozyPro等自动备份。这些通常是“设置并忘记它”。 也许你忘了呢?

我陷入了同样的情况。

如果在terminal硬件重置之前有一个已经更改的文件列表,进入我的编辑器(Sublime 2,无所谓),打开每个文件并打一次cmd + z(撤消),这样可以有效地解除变化完成硬重置,我得到了我未经承诺的变化回来:)

这里的关键问题是在对文件进行更改之后所做的。 如果创build了一个包含文件新状态的提交,那么通过查看git reflog最近的条目,find提交的SHA1sum,然后用git branch recovered <SHA1sum>创build一个新的git branch recovered <SHA1sum>或类似。 在这个答案中有一个这样做的例子。

如果你在任何文件上git addgit add来展示它们,你也应该能够找回它们,但是这样做更有效 – Jakub描述了如何在这个答案中做到这一点 。

如果你碰巧做了一个干净的地方,那么当然你可以像其他任何东西一样把它弄回来。

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

我希望事后指出这一点并不令人气愤,但只要切换回master分支,就不需要使用任何可能会丢失数据的命令 – git checkout master会告诉你,你已经在主分支上,并显示任何未提交的更改。 (可以说git reset --hard因为人们经常这样丢失数据,所以应该有一个“是的,我真的是这个意思”来确认是否存在未提交的修改。)

使用reflog。 git reflog会按时间顺序向您显示所有提交的历史logging。

如果你通过“检查出主人”而失去了你的改变,那么你可能是无头的。 git status会告诉你,如果你没有头部工作。 (和git branch )。

工作无头不是坏事(我总是故意这样做),但是你会更加依赖reflog。

如果您没有以任何方式提交您的更改,则无法检索这些文件。 这种可能发生的唯一现实的方法是,如果你做了硬复位,或明确强制结账。 除非您确定您对丢失数据感到满意,否则请勿强制更改。

通常,在git中,“强制”是通过指定-f来完成的。

我做了同样的事情,不止一次不幸。 没有提交任何东西,git不知道你写了什么。 即使你做了落后,我不确定reflection会有帮助。