Get back the changes after accidental checkout?

The following was the status of my repo.

[~/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, I did git checkout -f and now the changes are gone which I wasnt supposed to do.

[~/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)] ➔

Can I get back the changes back?

78701 次浏览

除非您以前曾经对这些文件使用过 git addgit stash,否则不幸的是,没有。如果您已经添加或隐藏了它们,那么您应该能够通过 git reflog找到它们的散列。

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

我不认为你可以恢复这些私有数据(“私有”是指“没有添加到索引中,也没有提交”,因此 git 不知道) ,除非你有其他备份进程为你当前的工作目录。

即使在 Git Aliases page 中没有提出这一点,我也会主张使用某种别名进行签出(比如 alias rm /bin/rm -i的用法) :

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

git stash; git stash apply布莱恩 · 坎贝尔他的回答中使用的“检查点技术”。

Stason 建议 在评论中:

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

Note, I added a message to tell backup stashes from others. –

This issue reminds me of a debate on this behavior on Y 组合子 (extracts):


我在 git 上丢失了很多数据。
大多数情况下,这些命令听起来无伤大雅,在删除数据时不需要确认。
例如,git checkout filename等价于 svn revert filename
当然,git checkout branchname的作用完全不同。
如果一个分支和一个文件共享相同的名称,git 将默认切换分支,但这并不能阻止 bash 自动完成功能毁掉这一天。

这里有一个疯狂的想法: 如果你有一个无害的行动和一个危险的行动,不要用同样的命令标签他们。


Annoying, maybe, but this is user error, not design error. With git, if I want to losslessly discard my working copy, I can just "git stash".
按照您的逻辑,“ rm”是有缺陷的,因为当您通过 -f而不是 -i时,它并不要求确认。是啊。对不起。


如果 rm somename等价于 apt-get update,而 rm othername等价于 rm -fr othername,那么您的类比会更准确。
尽管如此,“ get checkout foo”还是不能完全按照工作目录中是否存在一个叫 foo 的文件来做两件完全不同的事情


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

您还可以通过 IDE 查看其他内容。我偶然签出了2个文件,并能够通过 IDE (Netbeans)的“本地历史记录”恢复更改。多么幸福啊!

如果您正在使用 Eclipse,可以右键单击该文件并转到 Team-> Show Local History。

如果您在 Linux 上使用 vim,则可以应用以下方法。

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

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

  • 如果文件既没有打开的实质缓冲区也没有脏,如果您的工作副本是在 ext3或 ext4分区,那么 删除可能能够找到最近删除的。Swp 文件和/或源文件的旧版本。将分区重新挂载为只读,例如 mount -o remount,ro /mnt/point,然后运行

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

    如果包含工作副本的分区是根分区,它可能会拒绝重新挂载,然后尝试关闭所有服务,如果仍然没有去,然后关闭和启动使用 Live CD/USB/PXE,如 GRML,并运行以上。我成功地用这种方法找回了三分之一丢失的文件。

如果您使用 Eclipse 作为 IDE艾吉特,您的文件上有团队菜单:

  1. 从内部右键单击您的文件
  2. 列出项目“ Team”-> “ Show Local History”

您将看到所有的版本保存本地没有任何保存的名称,在我的情况下,但是,您可以很容易地检查所有未跟踪的变化的 git 功能和恢复您丢失的代码。

There is nothing you can do with git commands but if you are using IDE then you can recover your changes. I am using PhpStorm where we can see file changes history. 只需右键单击文件,然后单击显示本地历史。 在“外部更改”选项卡下,可以找到意外删除的本地更改。

如果您正在使用 IDE,并且 IDE 具有撤消选项,只需撤消更改,它就会撤消从磁盘重新加载的操作,从而恢复您的更改。大多数 IDE/编辑器都有这个选项。

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

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

1) git reflog

你可以看到如下输出

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

2) git checkout b0b3175f8890950218bba8906ffab0d6f84bf

如果你使用 智慧的想法,你可以点击鼠标右键在选定的 项目文件夹-> Lokal History (地方历史)-> 你可以看到所有的文件。

使用 VS Code,通过 CTRL + Z 从磁盘返回本地更改的过程非常顺利。

正如@VonC 提到一样,git checkout的模棱两可是这里的根本原因。但是设置检查点可能会让你的存货变得一团糟,如果没有得到很好的维护,最终将无法使用。

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

如果您使用 android 工作室恢复您的更改(这拯救了我)的最佳方法是:

右键单击根项目目录(包名称)。 2-本地历史-> 展览历史。

enter image description here.

3-恢复任何你想要的变化。

希望能有所帮助 对不起,我的母语不是英语。

您可以使用 vscode 文件时间线只需右键单击文件

enter image description here