在意外结帐后取回更改?

以下是我的回购的状态。

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

我可以找回变化吗?

我不认为你可以恢复这些私人数据(“私人”在“没有添加在索引中,也没有提交”,这是未知的混帐),除非你有其他的备份过程到位为您当前的工作目录。

即使这不是在Git Aliases页面中提出的,我也会为某种types的结帐进行争论(比如有alias rm /bin/rm -i用法):

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

,与' git stash; git stash apply git stash; git stash apply '作为Brian Campbell在他的回答中使用的“检查点技术”。

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


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

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


也许,烦人,但这是用户错误,不是devise错误。 用git,如果我想无损丢弃我的工作副本,我可以只是“ git stash ”。
根据你的逻辑,“rm”是有缺陷的,因为当你通过-f而不是-i时,它不要求确认。 那么,是的。 抱歉。


如果rm somenameapt-get update的等价物,而rm othernamerm -fr othername ,那么你的比喻会更加准确。
尽pipe如此,“ get checkout foo ”完成两个完全不同的事情之一是不对的,这取决于当前目录中是否有一个名为foo的文件


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

另一件事你可以看看是通过你的IDE。 我不小心签出2个文件,并能够通过我的IDE(netbeans)的“本地历史logging”带回更改。 多么幸福!

除非你曾经使用过git addgit stash ,那么不幸的是没有。 如果你已经添加或隐藏它们,那么你应该能够通过git reflogfind它们的哈希值。

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

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

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

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

  • 如果这些文件既不是在缓冲区中打开也不是脏的,并且如果您的工作副本在ext3或ext4分区上,则extundelete可能能够find最近删除的.swp文件和/或较早版本的源文件。 以只读方式mount -o remount,ro /mnt/point分区,例如mount -o remount,ro /mnt/point ,然后运行

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

    如果包含工作副本的分区是根分区,则可能拒绝重新挂载,然后尝试closures所有服务,如果还没有closures,请使用Live CD / USB / PXE(如GRML)closures和引导,然后运行以上。 我以这种方式成功恢复了三个丢失的文件中的一个。

如果你使用Eclipse作为IDEEGit ,那么你的文件就是Team-menu:

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

你会看到所有的版本保存在本地没有任何保存的名字,在我的情况,但是,你可以轻松地检查所有未追踪的变化出gitfunction,并恢复您的遗漏代码。