Git - 如何撤销未暂存文件的检出并丢弃本地更改

202

我在本地工作树中使用git checkout意外地丢弃了文件的更改。这些文件此时没有被暂存。有可能“撤销”此操作吗?


不,我们不能。但是如果您正在使用 Eclipse,我们可以检查 Team-->Local History。 - USM
17个回答

194
如果您使用的是“专业”IDE,那么有可能可以从本地历史记录恢复文件。例如,在Rubymine中,您可以右键单击文件并查看更改历史记录,与git更改无关,这在几次中为我节省了时间。^^

45
FYI,这项功能在JetBrains旗下的所有“专业”IDE中都可用:Pycharm、IDEA、PHPStorm、Webstorm。今天感谢Christoph拯救了我。 - B Robster
6
我必须感谢你。我使用WebStorm,但完全忘记了那个功能,尽管我经常使用它。我只是太专注于代码的丢失,没有想到这点! - Tyson Phalp
8
在 Eclipse 中,您可以右键单击文件 -> 比较与 -> 本地历史记录。 - Maragues
5
非常棒。Sublime2 撤销也可以回滚在磁盘上由意外的 git checkout 所做出的更改。 - shuckc
9
如果有人在XCode中误删了一些工作内容,可以通过以下方法获取AutoSave历史记录。 XCode本身没有菜单选项来查看AutoSave历史记录,但是它确实会存储它。如果您在TextEdit中打开相关文件,您可以通过“文件”>“还原”来恢复并查看AutoSave历史记录。 - qingu
显示剩余14条评论

132
我相信,如果一个文件被修改但尚未添加(暂存),那么它就是“私有”的。也就是说,如果用索引或HEAD版本覆盖了它,GIT无法恢复它(除非你在其他地方有当前工作的副本)。
“私有”内容只能在当前目录中看到,但在Git中没有任何注册方式。
注意:正如其他答案中所解释的那样,如果你使用一个带有本地历史记录的IDE或者有一个打开的编辑器(Ctrl+Z),你可以恢复你的更改。
我在2020年2月与VSCode 1.44一起提到了VSCode的时间线视图,这是一种使用IDE恢复更改的方法之一。

6
我了解在Git中,对于“私有”文件所做的更改是无法撤销的。但是,如果文件是通过Git进行修改的(例如通过 git checkout --),我希望它可以通过 reflog 操作来撤销该修改。这个期望是错误的吗? - Ciprian Tomoiagă
2
@CiprianTomoiaga reflog 用于恢复过去的 未引用 提交记录。如果您想要恢复的内容没有被提交(或暂存),reflog 将无法帮助您。 - VonC
4
对于任何私人内容(目前尚未添加),您需要完全依靠编辑器或IDE功能。例如,对于Eclipse:http://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2Ftasks%2Ftasks-87b.htm - VonC
13
哇!难以置信。我需要检出一个文件,所以本来想输入 git checkout folders/subfolders/file,但不小心在输入到 folder 后按下了回车,结果失去了所有的工作进度。我的键盘上 / 和回车键离得只有1厘米,而我经常在不同的计算机之间切换,它们的键盘布局也不同,所以我的手指需要花10-15分钟适应新位置。很难相信在2018年,Git竟然会删除文件,尽管Git手册中明确表示Git会尽最大努力避免数据丢失。 - gman
2
@gman,下面关于IDE提供的“本地历史记录”的答案是否有助于您恢复工作? - VonC
显示剩余4条评论

76

如果您正在使用Sublime Text等编辑器,且仍有相关文件打开,您可以按下ctrl+z,它将恢复到git checkout之前的状态。


1
我刚刚偶然发现了这个修复方法,本来打算发布一个新答案。看起来Sublime捕获了Git在其文件修改历史中更改文件状态的情况。 - Timmah
在Eclipse中对我有用。 - Anomaly
5
也适用于Visual Studio Code。 - intotecho

47

很遗憾,您的更改已经丢失。您的私有修改被简单地覆盖了。除非您在进行检出之前执行了 git stash...

从积极方面来看:现在您可以更好地实现事情了 ;)


34

在使用OS X开发?使用Xcode?那你很可能会有好运气!

正如qungu的评论所述,OS X会自动保存文件的版本历史记录,即使你没有使用时间机器。

所以,如果你不小心用git checkout .清除了未提交的本地更改,这里是你可以很可能恢复所有工作的方法。

如果有人在XCode中丢失了一些工作,有一种方法可以获取AutoSave历史记录。XCode本身没有菜单项来查看AutoSave历史记录,但它确实存储了它。如果你在TextEdit中打开相关文件,你可以通过“文件”>“还原”来查看AutoSave历史记录。

这真是太棒了,昨天为我恢复了大约一天的工作。


你可能会问:“为什么git命令行界面,这个在软件工程中至少在过去三十年里被广泛使用的首选版本控制系统,在删除文件之前不先备份一下呢?就像那些写得很好的软件工具一样。”
或者你可能会问:“为什么TextEdit有这个超级棒的文件历史功能,而我真正需要它的Xcode却没有?”
这两个问题,我认为,都能告诉你很多关于我们行业的事情。也许你会去修复这些工具,那将是非常棒的。

3
我可以确认这个有效。这刚刚为我节省了数小时的工作时间! - Bruno Rocha
无法正常工作,因为涉及的文件是“模型”文件。 - Siempay
@Benjohn 我的意思是 Model.xcdatamodeld - Siempay
1
这个刚刚让我少了很多烦恼。非常感谢你。 - squarefrog
1
非常有趣:我右键单击源文件并查看“打开方式”菜单。TextEdit 1.14和TextEdit 1.6都是选择项。只有TextEdit 1.14具有还原到旧版本的选项。用户界面非常好,就像TimeMachine一样。 - bugloaf
显示剩余5条评论

28

在你的集成开发环境中检查本地历史记录。


刚刚犯了一个错误,没有将我的更改暂存并强制检出。我在Android Studio中检查了我的本地历史记录(视图->最近更改),并还原了我所做的最后一次更改。更多信息请参见https://www.jetbrains.com/help/idea/2016.3/restoring-a-file-from-local-history.html。 - emen
这在RubyMine中完美地运作,撤销更改的操作将被称为“外部更改”。非常感谢Marcin,它刚刚帮我节省了一小时的工作时间! - Andrew Smith

10
在VSCODE中,ctrl+z(撤销)对我起作用了。
我使用了git checkout .而不是git add .,导致我所有的文件更改都丢失了。
但现在,在我的Mac上使用command + z,我恢复了这些更改,并为自己节省了大量的工作。

有其他的解决方法吗? - Abdul Manan

3

在这种情况下,一种有效的救世主是Time Machine(OS X)或类似的基于时间的备份系统。它曾经帮助过我几次,因为我可以回到过去并恢复那个特定的文件。


1
亲爱的点踩者 - 您能否请解释一下我该如何改进这个答案? - sscirrus

3
如果您之前曾经储藏过更改(例如,在变基之前),这将有所帮助。即使您已经 'stash pop'了更改,也可以使用这种方法恢复丢失的储藏。请参考如何在Git中恢复丢失的储藏?

2

从技术上讲,是可以的。但只有在某些情况下才能实现。例如,如果您打开了代码页面并点击了git checkout,然后意识到您不小心检出了错误的页面或其他内容。请转到该页面并单击撤消(对我而言,是command + z),它将返回到您在执行git checkout之前所在的确切位置。

如果您的页面已关闭,然后再执行git checkout,则无法使用此方法。它只适用于实际代码页面已打开的情况。


这节省了几个小时的工作时间(在使用 Visual Code 的 Angular 项目中)。值得庆幸的是,没有打开的那些只是易于完成的配置项。 - waleed
1
这在InteliJ中对我起作用了... 哇哈哈 :D - visc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接