【问题标题】:Accidentally reverted to master, lost uncommitted changes [closed]意外恢复为主,丢失未提交的更改[关闭]
【发布时间】:2011-11-01 03:19:36
【问题描述】:

在主分支上工作时,我忘了创建新分支。对文件进行了更改,然后无意中恢复到主文件,丢失了所有更新。 我没有提交更新的文件。

我怎样才能找回它们?

【问题讨论】:

  • 在下面的评论中,您提到能够通过 stash 恢复您的工作,通过 GitHub GUI 自动保存。我还没有看到实际的 GUI,并且一直担心丢失东西,想知道警告消息是什么样的等。您能否编辑您的问题以进一步澄清实际发生的事情,以便我们都能受益?
  • 如果您使用的是任何 JetBrains 软件,请右键单击并转到“本地历史记录 > 显示历史记录”。从这里,您应该会看到与 Git 历史记录分开的本地编辑历史记录列表。您可以选择要恢复到的任何版本。

标签: git


【解决方案1】:

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

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

  • 如果您曾经提交某些更改并且丢失了该提交(例如在分离状态下提交),您可以使用 reflog 找到该提交。看到这个SO question*。

  • 如果您丢失了最后一次分阶段更改,您也可以恢复它。请参阅此SO question*。 (我自己从未使用或尝试过)。

  • 如果您隐藏更改,您也可以使用popapply 恢复该更改。 (我不确定弹出/丢弃的存储是否也可以恢复但未提交)。您可能会发现这个Recover dropped stash in git 很有用。

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

【讨论】:

  • 你是stash 提示让我找到了正确的行动方案。非常感谢
  • 您可能需要编辑您的答案以指出您也可以取回仅暂存的文件,因为该操作仍将它们放入对象数据库中。 (见我回答的第二段。)
  • 添加了一些关于恢复丢失更改的要点。
  • 一些 IDE 跟踪本地文件历史记录,完全独立于源代码控制。
  • 如果您正在处理一个 Web 项目并且碰巧在浏览器中加载了相关文件,则该文件的副本可能仍然在缓存中可用(不要重新加载页面,否则您会丢失的!)我能够使用这种方式恢复丢失的文件。见sensefulsolutions.com/2012/01/…
【解决方案2】:

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

【讨论】:

  • Eclipse 将此功能称为“本地历史记录”。您甚至可以恢复尚未暂存、隐藏或提交的文件。
  • 谢谢你把这个想法放在我的脑海里!!我能够在 Dropbox 网络界面中恢复“已删除”的文件!你救了我的培根。 Recover deleted files in dropbox
  • 我在 Eclipse 上犯了同样的愚蠢错误。我在没有显示历史记录的已更改文件上右键单击->从本地历史记录恢复...。但是当我右键单击->替换为->本地历史时...我看到了一个更改列表。那救了我。希望这对某人有所帮助。
  • 谢谢你的回答!!!!我永远感激你的回答。 PHPStorm 具有独立于 Git 的单个文件的 VCS -> 本地历史记录。我之前犯了一个非常愚蠢的错误,导致我未提交的更改丢失。大约工作了三天。非常感谢!!!!!!!!!!!!!!!!!!!!!!!!
  • 我差点哭了,你的回答救了我的命,感谢 eclipse ide :D
【解决方案3】:

我陷入了同样的境地。

在 --hard 重置之前在终端中有一个已更改文件的列表,进入我的编辑器(Sublime 2,不过没关系),打开每个文件并按一次 cmd+z(撤消),这很有效撤消了硬重置所做的更改,我得到了我未提交的更改:)

【讨论】:

  • 在 VS Code 中同样适用于我。
  • 你就是男人!
  • 我在vscode 中使用vim 并点击u 进行撤消没有任何效果。所以,我切换了 vim,然后点击 ctrl+z 恢复所有内容。
【解决方案4】:

这里的关键问题是您在更改文件后做了什么。如果您创建了一个包含文件新状态的提交,那么您应该能够通过查看git reflog 中的最近条目,找到提交的 SHA1sum,然后使用 @ 创建一个新分支来取回它们987654324@,或类似的。 this answer 中有一个这样做的例子。

如果您对任何文件执行了git add 以暂存它们,您也应该能够将它们取回,但这是相当多的工作 - Jakub 在this answer 中描述了如何执行此操作。

如果您碰巧通过git stash 给自己一个干净的状态,那么您当然可以像处理任何其他存储一样将其取回。

否则,恐怕消息不好。

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

【讨论】:

  • 当我执行git reset --hard HEAD~1 时,bash 命令行没有问我任何问题。所有未暂存的未提交更改都消失了。没有问题。
  • @RobertKoritnik 我想你可能误解了我回答的最后一句话——我说的是“你确定吗?”确认git reset --hard 何时可能丢失数据将是一个很好的功能,而不是 git 所做的。
【解决方案5】:

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

如果您因“签出 master”而丢失了更改,那么您可能正在无头工作。 git status 会告诉您您是否正在无头工作。 (git branch 也是如此)。

无头工作并没有那么糟糕(我一直都这样做,是故意的),但你会更加依赖 reflog。

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

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

【讨论】:

  • 感谢您的快速回复,在 reflog 中找不到 ref,但很可能我做错了。使用 GitX 并找到了一个藏匿处,将其弹出。
【解决方案6】:

不幸的是,我不止一次做过同样的事情。没有提交任何东西,git 不知道你写了什么。即使您确实做出了承诺,但我不确定反射是否会有所帮助。

【讨论】:

  • 感谢您的快速回复,我一直在尝试使用 GitHub GUI,在生产环境中做这件事很愚蠢,但你去吧。在我造成伤害之前,它似乎执行了 stash
  • 很高兴听到你比我幸运:)
  • @Trist 这就是为我做的。当我看到你的评论时,我正要诅咒 GitHub,因为它可以很容易地在不提交的情况下切换分支(并且在 GUI 中没有可见的存储功能)。 git stash apply 拯救了这一天。
猜你喜欢
  • 2021-01-11
  • 2012-04-02
  • 2011-03-15
  • 2020-05-15
  • 2012-11-19
  • 2015-11-20
  • 2021-03-26
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多