在意外结帐后取回更改?
以下是我的回购的状态。
[~/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 reflog
find它们的哈希值。
我从来没有对这种破坏性的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,并恢复您的遗漏代码。