可以git撤消未暂存文件的签出


164

我不小心通过git checkout放弃了对本地工作树中文件的更改。文件目前暂不上演。是否可以“撤消”此结帐?


不,我们不能,但是如果您使用的是月食,我们可以检查团队->当地历史
USM

Answers:


105

我相信,如果文件已修改但尚未添加(暂存),则它纯粹是“私有”的。
这意味着如果用索引或HEAD版本覆盖,则GIT无法恢复它(除非您在某处拥有当前工作的副本)。”

“私有”内容仅在当前目录中可见,但未以任何方式在Git中注册。


5
我了解git无法撤消对“私人”文件的更改。但是,如果文件是由git修改的(例如通过git checkout --),我希望它能够撤消该操作,也许是通过reflog。那是错误的期望吗?
西普里安·托莫阿格(CiprianTomoiagă)2016年

2
@CiprianTomoiaga reflog用于过去的未引用提交。如果您要还原的内容未提交(或暂存),则reflog将无济于事。
VonC

3
@CiprianTomoiaga对于任何类型的私人内容(尚未添加),您将完全依赖于编辑器或IDE功能。eclipse的示例:help.eclipse.org/neon/…–
VonC

5
哇!难以置信。我需要签出一个文件,所以我想输入git checkout folders/subfolders/file但进入folder并丢失所有工作后偶然按回车键。/距键盘输入距离为1厘米,并且我经常在具有不同键盘布局的机器之间进行切换,因此我的手指通常需要10到15分钟的时间才能适应新位置。即使在git书中说git这样做是为了不丢失工作,但很难相信git在2018年会破坏文件。
gman

1
@gman以下关于IDE提供的“本地历史记录”的答案是否可以帮助您恢复工作?
VonC

173

如果您使用的是“专业” IDE,则很有可能可以从本地历史记录中还原文件。例如,在Rubymine中,您可以右键单击文件并查看与git更改无关的更改历史,现在为我保存了几次^^


36
仅供参考,此功能在“专业” IDE的整个JetBrains系列中可用:Pycharm,IDEA,PHPStorm,Webstorm。今天救了我巴肯。谢谢克里斯托夫!
本·罗伯茨

6
我要谢谢你 我使用WebStorm,即使我经常使用它,也完全忘记了该功能。我只是陷入了代码丢失的困境,我没有考虑!
泰森·菲尔普

8
在日食中,您可以右键单击文件->与->比较本地历史
-Maragues

5
高超。Sublime2撤消还回滚了磁盘上意外git checkout所做的更改。
shuckc 2013年

8
如果有人发现该线程破坏了XCode中的某些工作,则有一种获取AutoSave历史记录的方法。XCode本身没有菜单项来查看“自动保存”历史记录,但确实存储了它。如果您在TextEdit中打开有问题的文件,则可以还原并在“文件”>“还原”下浏览“自动保存”历史记录。
qingu 2014年

66

如果您正在使用Sublime Text之类的编辑器,并且仍在打开有问题的文件,则可以按ctrl + z,它将返回到git checkout之前的状态。


9
这个答案保存了我的一天。非常感谢!
feyyaz

我偶然偶然发现了此修复程序,并打算发布一个新答案。看起来Sublime在其文件修改历史记录中捕获了更改文件状态的Git。
Timmah

在Ecipse中为我工作。
异常

4
也曾

44

不幸的是,您的更改丢失了。您的私人修改只会被覆盖。除非您git stash事先进行结帐...

从光明的一面来看:您现在可以更好地实施;)


26

在您的IDE中检查本地历史记录。


只是犯了一个错误,没有进行我的更改并强制结帐。我在Android Studio中查看了我的本地历史记录(查看->最近的更改),并还原了我所做的最后更改。更多信息在这里jetbrains.com/help/idea/2016.3/…–
emen

这在RubyMine中效果很好,清除更改的操作将称为“外部更改”。非常感谢Marcin,这为我节省了一个小时的工作时间!
AndrewSouthpaw

25

OS X开发?使用Xcode?您可能很幸运!

qungu评论中所述,即使您不使用Time Machine,OS X 也会保留文件的自动保存版本历史记录。

所以,如果你吹走满不在乎的不分阶段的局部变化git checkout .,这里是你如何能可能恢复所有的工作。

如果有人发现该线程破坏了XCode中的某些工作,则有一种获取AutoSave历史记录的方法。XCode本身没有菜单项来查看“自动保存”历史记录,但确实存储了它。如果在TextEdit中打开有问题的文件,则可以还原并在“文件”>“还原”下浏览“自动保存”历史记录。

真棒,昨天为我工作了大约一天的时间。


您可能会问:“为什么不使用git命令行界面,即用于软件工程的首要VCS?2016年 2017年 2018年2019年,至少要在备份文件之前备份文件?就像您知道的,大约三十年来写得很好的软件工具。”

或者,您可能会问:“为什么在TextEdit中可以使用此超棒的文件历史记录功能,而在我实际需要的地方却无法使用Xcode?”

…而且我认为,这两者都将向您全面介绍我们的行业。或者,也许您将去修复那些工具。哪个超级好。


2
我可以确认这可行。这只是节省了我的工作时间!
布鲁诺·罗查

不适用于我,因为相关文件很Model不幸
brahimm

@brahimm模型?
约翰

1
这只是节省了我一吨的心痛。非常感谢。
squarefrog '18

1
非常有趣:我右键单击源文件,然后查看“打开方式”菜单。可以选择TextEdit 1.14和TextEdit 1.6。只有TextEdit 1.14可以选择还原到较早的修订版。用户界面非常漂亮,就像TimeMachine一样。
bugloaf

6

在VSCODE中,ctrl + z(撤消)为我工作

我做了git checkout .,而不是git add .和我所有的文件更改丢失。

但是,现在command + z在我的mac中使用,恢复了更改并为我节省了工作时间。


还有其他办法吗?
阿卜杜勒·马南


2

对于这种情况,有效的救星是Time Machine(OS X)或类似的基于时间的备份系统。它为我节省了几次,因为我可以返回并仅还原一个文件。


1
亲爱的唐纳德·沃特-您能解释一下我如何改善这个答案吗?
sscirrus '16



0

从技术上讲是。但仅在某些情况下。例如,如果您打开了代码页,并点击了git checkout,然后您发现自己不小心签出了错误的页面或其他内容。转到页面,然后单击撤消。(对我来说,请使用Command + z),然后它将返回到您之前击打旧git checkout之前的位置。

如果您的页面已关闭,然后单击git checkout,则此方法将无效。它仅在打开实际代码页时有效


0

如果你有一个终端/工作命令提示符打开,并使用了会显示未分级的变化(任何Git命令diffadd -pcheckout -p,等),并没有关闭终端/ Cmd的,因为提示,你会发现不分级的变化如果您向上滚动到运行上述git命令的位置,仍然可用。


0

杜德

可以说您像我一样是个非常幸运的人,回到您的编辑器并执行撤消(对于Mac为Command + Z),您应该在文件中看到丢失的内容。希望对您有帮助。当然,这仅适用于现有文件。


-1

也许您的更改没有丢失。检查“ git reflog”

我引用以下文章:

“基本上,您在存储数据的Git内部执行的每个操作都可以在reflog中找到。Git会尽力不丢失数据,因此,如果出于某种原因,您有可能将其挖掘出来使用git reflog”

查看详细信息:

http://gitready.com/intermediate/2009/02/09/reflog-your-safety-net.html


3
别抱太大希望-仅当您以有意义的方式与git交互时,获取reflog才有帮助。只是编辑文件,然后通过git checkout将其删除?git从来没有机会。
鲍勃·吉尔摩尔

1
从我那里+ 1- 在git reflog这里值得一提,我在寻找撤消a时找到了这个答案git checkout HEAD .-我本想输入git reset HEAD .-我刚刚做了一个'git reset --soft HEAD〜1',不知道关于git reflog这样的事情能够恢复我所做的工作:)
罗素(英国)

1
不幸的是git checkout <revision>和git checkout <path>是两个完全不同且不相关的命令。前者保留您的本地更改,而后者则不保留。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.