撤销对未提交文件的git checkout覆盖

10

我曾使用命令 git checkout -- $(git ls-files -m) 来撤销 git 对一些文件的 rm 操作。但是,我修改了其他一些文件并没有提交它们,这些文件已经被还原到了之前的提交版本,未提交的更改也因此丢失了。

有没有办法找回这些更改呢?
我想 git 无法做到,因为这些更改没有被添加到 git 中。我用的是 Mac 系统,这是否有所帮助。

谢谢, 汤姆


1
检查 git reflog。在你的情况下可能会有帮助。它就像是一张可以重置到还原点的列表。http://git-scm.com/docs/git-reflog - Tim
2
如果你使用了 git add 命令添加了修改后的内容,那么它们现在已经存储在版本库中,并且会被显示为"悬空blob"(可以使用 git fsck --lost-found获取文件内容,但是文件名已经丢失)。如果没有这样操作...好吧,如果 Time Machine 备份了它们,你可能可以从那里找到它们。否则,它们很可能已经丢失了。 - torek
1
我没有进行git add操作,而且时间机器也没有这些更改 :( - holmeswatson
1
这个问题可以/应该概括为“git checkout是否真的会悄悄地覆盖未提交的更改?”而答案在2018年仍然是“是的”(刚刚测试了2.11)...只需要一个偶然/健忘的“git checkout .” 就可以告别所有未完成的工作,每个文件都如此!:-o没有警告,没有一句话。好像这可能是最幸福的结果一样。(互联网似乎对此保持着沉默,只需看看您的问题得到了零回答。:)或者,更糟糕的是:我甚至看到推理,相当于说format c:rm -r不应该询问,因为您故意发出了命令... :) ) - Sz.
2个回答

3

"git checkout真的会在不提示的情况下覆盖未提交的更改吗?"
答案仍然是"是的",在2018年(刚测试过2.11)

在2019年8月,使用Git 2.23仍然如此,但现在有一个更加 明确的git restore命令

简单的git restore .也会从索引内容恢复工作树(因此,如果文件被修改但未添加到该索引中,则它们的更改仍将丢失)

但至少现在 不存在文件和分支checkout之间的混淆


1
我想问一个 Stack Overflow 的问题,像“为什么 git checkout myfile 会在没有警告的情况下覆盖对 myfile 的更改?”但我觉得这样做只是在抱怨我们都知道的事情,对吧? - matt
@matt 最终,git checkout 将被淘汰(过时)。只有 git switchgit restore 会保留。 - VonC
还有git restore表现更好吗?我的git版本太旧无法测试。 - matt
@matt 这就是我在 https://dev59.com/mVYM5IYBdhLWcg3wrRqC#57066072 中所描述的:它仍然可以覆盖文件内容,但这是显式的:你想要恢复文件的内容。 - VonC
1
很酷,谢谢。我的直觉告诉我这仍然是错误的: 就像如果您的未提交更改会被覆盖,则无法切换分支一样,如果还原到另一个提交版本将擦除您未提交/未添加的更改,则至少应该收到警告。但也许我只是期望太多了。 :) - matt

2

默认情况下你无法找回被git checkout filename误删的文件,但在紧急情况下可能会有所运气,按以下方式尝试找回文件:

  • 你可能仍然可以从文本编辑器的缓存中获取文件(对于我来说,在BBEdit文本编辑器中,如果我打开了它,我可以使用
    撤销来取回文件,因为如果磁盘上的文件被更改,它往往会加载到当前版本),然后保存。
  • 如果你启用了连续备份,你也可以尝试获取你编辑过的版本。例如,苹果时间机器可能会有一份最近时间的版本。

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