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

Tri*_*ist 61 git

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

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

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

Sai*_*esh 71

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

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

  • 如果您曾经提交过一些更改并且丢失了该提交(比如提交处于分离状态),您可以使用找到该提交reflog.看到这个问题*.

  • 如果您丢失了上次暂存的更改,则还可以恢复该更改.看到这个问题*.(我自己从未使用或尝试过).

  • 如果您隐藏了更改,您还可以使用pop或恢复apply.(我不确定弹出/丢弃的藏匿处是否也可以恢复,但未提交).你可能会发现这个在git中使用的Recover drop stash非常有用.

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

  • 某些IDE会跟踪本地文件历史记录,完全独立于源代码控制. (6认同)
  • 您的“秘诀”提示使我找到了正确的做法。确实非常感谢 (2认同)
  • 您可能希望编辑您的答案,指出如果文件仅被暂存,您也可以取回文件,因为它们仍然通过该操作放入对象数据库.(见我答案的第二段.) (2认同)
  • 我也曾经历过同样的情况。当我快要失去所有希望时,我意识到我_确实_有我最近修改的项目的编译版本,因为我运行了它一次来测试新功能。然后我想到使用 [ILSpy](https://github.com/icsharpcode/ILSpy) 反编译我的“.exe”文件。它并不完美,但我能够完全恢复所有更改,而无需从头开始重新编码所有内容。 (2认同)

Chr*_*ton 37

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

  • Eclipse将此功能称为"本地历史记录".您甚至可以恢复尚未暂存,隐藏或提交的文件. (7认同)
  • 我在Eclipse上犯了同样的愚蠢错误.我右键单击 - >从本地历史记录恢复...在更改的文件上显示没有历史记录.但是,当我右键单击 - >替换 - >本地历史记录时...我看到了一个更改列表.这救了我.希望这有助于某人. (4认同)
  • 谢谢您的回答!!!!我永远感激你的回答.PHPStorm具有VCS - >本地历史记录,用于独立于Git的单个文件.我之前犯了一个非常愚蠢的错误,导致我的未提交的更改丢失了.这是大约三天的工作.非常感谢!!!!!!!!!!!!!!!!!!!!! (3认同)
  • 我几乎哭了,你的回答救了我的命,感谢 eclipse ide :D (2认同)

小智 15

我陷入了同样的境地.

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

  • 在 VS Code 中同样适用于我。 (2认同)
  • 你就是那个男人! (2认同)

Mar*_*air 8

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

如果您git add对任何文件进行了演示,那么您也应该能够将它们取回,但这是更多的工作 - Jakub在这个答案中描述了如何做到这一点.

如果你碰巧做了一个git stash给自己一个干净的状态,那么当然你可以像任何其他藏品那样取回它.

否则,我担心新闻不好.

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

  • @RobertKoritnik我想你可能误解了我答案的最后一句 - 我说的是"你确定吗?" 确认`git reset --hard`可能会丢失数据*将是一个很好的功能,而不是git的功能. (2认同)