77

以下是我的回购的状态。

[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ gst
# On branch design
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   _layouts/default.html
#   deleted:    _site/blog/2010/04/07/welcome-to-niraj-blog/index.html
#   deleted:    _site/blog/2010/04/08/the-code-syntax-highlight/index.html
#   deleted:    _site/blog/2010/05/01/showing-demo-to-kalyan/index.html
#   deleted:    _site/config.ru
#   deleted:    _site/index.html
#   deleted:    _site/static/css/style.css
#   deleted:    _site/static/css/syntax.css
#   modified:   static/css/style.css
#
no changes added to commit (use "git add" and/or "git commit -a")

Accedently,我做到了git checkout -f,现在我不应该做的改变已经消失了。

[~/rails_apps/jekyll_apps/nepalonrails (design)⚡] ➔ git co -f
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ gst
# On branch design
nothing to commit (working directory clean)
[~/rails_apps/jekyll_apps/nepalonrails (design)] ➔ 

我可以取回更改吗?

4

13 回答 13

80

您可以查看的另一件事是通过您的 IDE。我不小心签出了 2 个文件,并且能够通过我的 IDE(netbeans)的“本地历史记录”恢复更改。多么幸福啊!

于 2012-02-02T14:06:53.003 回答
60

我认为您无法恢复这些私有数据(“私有”,如“未添加到索引中,也未提交”,因此 git 不知道),除非您为当前工作目录设置了其他备份过程。

即使在Git Aliases page中没有提出这一点,我也会为结帐提供某种别名(就像有alias rm /bin/rm -i用法一样):

[alias]
co = !sh -c 'git stash; git stash apply; git checkout "$@"'

,其中 ' ' 是Brian Campbell他的回答git stash; git stash apply中使用的“检查点技术” 。

stason在评论中提出:

co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\"" 

注意,我添加了一条消息来告诉其他人的备份存储。——</p>

这个问题让我想起了关于ycombinator(摘录)的这种行为的辩论:


我用 git 丢失了很多数据。
其中大部分与删除数据时不要求确认的听起来无害的命令有关
例如,git checkout filename等价于svn revert filename
当然git checkout branchname会做一些完全不同的事情。
如果一个分支和一个文件共享相同的名称,git 将默认切换分支,但这并不能阻止 bash 自动完成破坏这一天。

这是一个疯狂的想法:如果你有一个无害的动作和一个危险的动作,不要用相同的命令标记它们。


也许很烦人,但这是用户错误,而不是设计错误。使用 git,如果我想无损地丢弃我的工作副本,我可以“ git stash”。
按照您的逻辑,“rm”是有缺陷的,因为当您通过-f而不是-i. 嗯,是的。对不起。


rm somename如果是 和 的等价物,apt-get update您的类比会更准确。 尽管如此,根据当前目录中是否有一个名为 foo 的文件,“”做两种完全不同的事情之一是不对的rm othernamerm -fr othername
get checkout foo


这是另一个疯狂的想法:不要git checkout ...在肮脏的工作树上运行 ' '。问题解决了。
另一个:不要重用文件名作为分支名。
老实说:粗心调用 ' rm' 毁了我的一天,我也有同样的问题,但是当我喃喃自语时,这是因为我的懒惰/愚蠢,而不是 bash 完成或 ' rm'的行为

于 2010-06-02T20:28:03.427 回答
26

除非您以前曾经使用过git addgit stash使用过这些文件,否则很遗憾没有。如果您添加或隐藏了它们,那么您应该能够通过git reflog.

我从来没有对这种破坏性的行为感到满意git checkout。也许一个有用的增强是git checkout在覆盖您的工作之前自动创建一个存储(以便通过 reflog 捕获文件)。

于 2010-06-02T20:16:46.990 回答
6

使用VS Code可以顺利地通过 CTRL+Z 从磁盘获取本地更改。所以尝试使用IDE。

于 2020-08-03T11:40:51.690 回答
5

如果您在 Linux 上使用 vim,以下内容可能适用。

  • 如果文件在活动缓冲区中打开,那么只要您不在 vim 中重新加载文件,您就可以获得文件内容,并且可以通过保存来恢复。.

  • 如果文件未在活动缓冲区中打开,但很脏,则源目录中应该有一个 .swp 文件,该文件还包含可通过 .swp 恢复的内容副本vim -r file.swp

  • 如果文件既没有在前缓冲中打开也没有脏文件,并且如果您的工作副本位于 ext3 或 ext4 分区上,则extundelete可能能够找到最近删除的 .swp 文件和/或旧版本的源文件。将分区重新挂载为只读,例如mount -o remount,ro /mnt/point,然后运行

    extundelete --recover-directory /path/to/working/copy /dev/sdaX
    

    如果包含工作副本的分区是根分区,它可能会拒绝重新挂载,然后尝试杀死所有服务,如果仍然不行,则使用 Live CD/USB/PXE,如GRML关闭并启动,然后运行多于。通过这种方式,我成功地恢复了三分之一丢失的文件。

于 2014-10-08T19:36:01.270 回答
5

如果您使用Eclipse 作为 IDEEGit,您的文件中包含 Team-menu:

  1. 从内部右键单击您的文件
  2. 列表项“团队”->“显示本地历史”

您将看到所有版本都保存在本地,没有任何保存名称,在我的情况下,您可以轻松检查 git 功能中所有未跟踪的更改并恢复丢失的代码。

于 2016-08-30T08:23:50.193 回答
4

如果您使用IntelliJ Idea ,您可以在选定的项目文件夹上单击鼠标右键-> Lokal History -> 您可以看到所有文件。

于 2020-05-28T12:30:44.860 回答
3

如果 IDE 是 Android Studio,则打开已更改的文件并转到 VCS -> Local History -> Show History。打开的文件将显示在那里。

于 2019-08-09T06:11:34.980 回答
3

我正在使用 Intellij。CTRL+z对我有用,它会提示您“从磁盘重新加载更改”,然后点击是。

于 2019-09-04T19:53:05.930 回答
1

如果您使用的是 IDE,并且如果它具有撤消选项,则只需撤消更改,它将撤消从磁盘重新加载,这将带回您的更改。大多数 IDE / 编辑器都有这个选项。

于 2018-09-18T05:48:33.377 回答
1

1)git reflog

你可以看到像下面的输出

f7de337 (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from b0b3175f8890950218bba8906ffab0d6f84bf to master

2)git checkout b0b3175f8890950218bba8906ffab0d6f84bf

于 2020-02-28T10:53:46.477 回答
1

正如@VonC提到的那样,歧义git checkout是这里的根本原因。但是创建检查点可能会使您的存储变得一团糟,如果维护不当,最终将无法使用。

我最终只是使用git switch而不是git checkout分支切换。是的,你需要改变你的习惯,但从我的观点来看,这是最终的解决方案。

于 2022-02-17T07:18:38.457 回答
0

您无法使用 git 命令执行任何操作,但如果您使用的是 IDE,那么您可以恢复您的更改。我正在使用 PhpStorm,我们可以在其中查看文件更改历史记录。只需右键单击文件,然后单击显示本地历史记录。在外部更改选项卡下,您可以找到意外删除的本地更改。

于 2017-12-05T06:00:47.880 回答