意外结账后取回更改?

时间:2010-06-02 20:11:24

标签: git git-checkout

以下是我的回购的状态。

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

当然,我做了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)] ➔ 

我可以取回更改吗?

12 个答案:

答案 0 :(得分:49)

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

答案 1 :(得分:44)

我认为你不能恢复那些私有数据(“私有”,如“没有添加到索引中,也没有提交”,因此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”是Brian Campbellhis answer使用的“检查点技术”。

stason建议in the comments

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

请注意,我添加了一条消息,告诉其他人备份。 -

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


  

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

     

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


  

烦人,也许,但这是用户错误,而不是设计错误。有了git,如果我想无损地丢弃我的工作副本,我可以“git stash”   根据您的逻辑,“rm”存在缺陷,因为当您通过-f而不是-i时,它不会要求确认。嗯,是的遗憾。


  

如果rm somename相当于apt-get update,而rm othernamerm -fr othername,则您的类比会更准确。
  但是,根据当前目录中是否存在名为foo的文件,“get checkout foo”完成两个完全不同的事情之一是不对的。


  

这是另一个疯狂的想法:不要在脏工作树上运行'git checkout ...'。问题解决了。
  另一个:不要将文件名重用为分支名称   说实话:我有同样的问题,不小心调用“rm”毁了我的一天,但是当我在诅咒诅咒时,它是在我的懒惰/愚蠢,而不是在bash完成或'{{1的行为}}“

答案 2 :(得分:21)

除非您之前曾使用过git addgit stash这些文件,否则很遗憾。如果您已添加或隐藏它们,那么您应该能够通过git reflog找到它们的哈希值。

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

答案 3 :(得分:5)

以下内容可能适用于您在Linux上使用vim的情况。

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

  • 如果文件未在活动缓冲区中打开,但是文件是脏的,则源目录中应该有一个.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关闭和启动,如{{ 3}},然后运行上面的内容。我成功地以这种方式恢复了三个丢失的文件中的一个。

答案 4 :(得分:3)

如果你使用 Eclipse作为IDE EGit ,你的团队菜单上有你的文件:

  1. 中右键单击您的文件
  2. 列出项目“团队” - &gt; “显示本地历史”
  3. 在我的情况下,您将看到所有版本都保存在本地而没有任何保存名称,但是,您可以轻松地检查git功能中所有未经跟踪的更改并恢复丢失的代码。

答案 5 :(得分:3)

如果IDE是Android Studio,则打开已更改的文件,然后转到VCS->本地历史记录->显示历史记录。打开的文件将显示在此处。

答案 6 :(得分:0)

使用git命令无法做任何事情,但如果您使用的是IDE,则可以恢复更改。 我正在使用PhpStorm,我们可以看到文件更改历史记录。 只需右键单击文件,然后单击显示本地历史记录。 在“外部更改”选项卡下,您可以找到意外删除的本地更改。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

1)System.Runtime.dll 4.2.1.0

您可以看到下面的输出

git reflog

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

答案 10 :(得分:0)

使用 VS Code 可以顺利进行,通过CTRL + Z从磁盘取回本地更改。因此,请尝试使用IDE。

答案 11 :(得分:-1)

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