无意中恢复了主人,丢失了未提交的更改

时间:2011-08-22 12:47:06

标签: git

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

我是否丢失了所有更新,还是可以检索它们?

不要问我怎么做,因为每当我想到它时,我都必须在脸上打自己。

6 个答案:

答案 0 :(得分:64)

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

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

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

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

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

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

答案 1 :(得分:36)

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

答案 2 :(得分:11)

我遇到了同样的情况。

在--hard reset之前有终端中已更改文件的列表,进入我的编辑器(Sublime 2,尽管无关紧要),打开每个文件并点击cmd + z(撤消)一次,这有效取消硬重置所做的更改,我得到了未提交的更改:)

答案 3 :(得分:7)

这里的关键问题是您对文件进行更改后所执行的操作。如果您创建了一个包含文件新状态的提交,那么您应该能够通过查看git reflog中的最新条目来找回它们,找到提交的SHA1sum然后从中创建一个新分支。与git branch recovered <SHA1sum>或类似的。这是在this answer中执行此操作的示例。

如果您对任何文件进行了git add以进行演示,那么您也应该能够取回它们,但这是更多的工作 - Jakub在this answer中介绍了如何执行此操作。

如果您碰巧做了git stash给自己一个干净的身份,那么当然您可以像其他任何藏匿一样取回它。

否则,我担心这个消息不好。

我希望事后指出这一点并不令人愤怒,但只要切换回master分支,就不应该使用任何可能会丢失数据的命令 - {{1}会告诉你,你已经在主分支上,并显示任何未提交的更改。 (可以说git checkout master应该有一个“是的,我真的是这个”确认,如果有未提交的更改,考虑到人们git reset --hard这种方式会以这种方式丢失数据的频率。)

答案 4 :(得分:2)

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

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

无头工作并不是那么糟糕(我故意这么做,故意),但你会更加依赖reflog。

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

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

答案 5 :(得分:1)

我做过同样的事情,不幸的是不止一次。没有提交任何东西,git不知道你写了什么。即使你确实在落后时提交,我也不确定反射会有所帮助。