在意外结帐后取回更改?
以下是我的回购的状态。
[~/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 somename是apt-get update的等价物,而rm othername是rm -fr othername,那么你的比喻会更加准确。
尽pipe如此,“get checkout foo”完成两个完全不同的事情之一是不对的,这取决于当前目录中是否有一个名为foo的文件
这是另一个疯狂的想法:不要在脏工作树上运行“
git checkout ...”。 问题解决了。
另一个:不要重复使用文件名作为分支名称。
说实话,我有同样的问题,不小心调用“rm”毁了我的一天,但是当我嘟嘟curs it的时候,这是在我的懒惰/愚蠢,而不是在bash完成或“rm”
另一件事你可以看看是通过你的IDE。 我不小心签出2个文件,并能够通过我的IDE(netbeans)的“本地历史logging”带回更改。 多么幸福!
 除非你曾经使用过git add或git 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作为IDE和EGit ,那么你的文件就是Team-menu:
- 从内部右键单击您的文件
- 列出项目“团队” – >“显示本地历史logging”
你会看到所有的版本保存在本地没有任何保存的名字,在我的情况,但是,你可以轻松地检查所有未追踪的变化出gitfunction,并恢复您的遗漏代码。