以下是我的回购的状态.
[~/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")
Run Code Online (Sandbox Code Playgroud)
我突然做了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)] ?
Run Code Online (Sandbox Code Playgroud)
我可以收回更改吗?
gig*_*gi2 56
您可以通过IDE查看另一件事.我不小心检查了2个文件,并能够通过我的IDE(netbeans)的"本地历史记录"恢复更改.真是太幸福了!
Von*_*onC 46
我不认为您可以恢复那些私有数据("私有",如"未添加到索引中,也未提交",因此git未知),除非您的当前工作目录有其他备份过程.
即使在Git Aliases页面中没有提出这个问题,我也会争论结帐的某种别名(比如alias rm /bin/rm -i有用):
[alias]
co = !sh -c 'git stash; git stash apply; git checkout "$@"'
Run Code Online (Sandbox Code Playgroud)
随着Brian Campbell在他的回答中git stash; git stash apply使用' '作为"检查点技术" .
co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\""
Run Code Online (Sandbox Code Playgroud)
请注意,我添加了一条消息,告诉其他人备份. -
这个问题让我想起了关于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 othername为rm -fr othername.
但是,get checkout foo根据当前目录中是否存在名为foo的文件," "完成两个完全不同的事情之一是不对的.
这是另一个疯狂的想法:不要
git checkout ...在肮脏的工作树上运行' '.问题解决了.
另一个:不要将文件名重用为分支名称.
说实话:我有同样的问题,粗心的调用rm"毁了我的一天,但是当我嘀咕诅咒时,它是在我的懒惰/愚蠢,而不是在bash完成或'rm' 的行为' '
Gre*_*ill 22
除非您以前使用过git add或git stash使用过这些文件,否则很遗憾没有.如果你已添加或隐藏它们,那么你应该能够找到它们的哈希值git reflog.
我从未对这种破坏性行为感到满意git checkout.也许一个有用的增强功能是git checkout在覆盖你的工作之前让这种自动创建一个存储(以便通过reflog捕获文件).
小智 18
如果您使用IntelliJ Idea,您可以在选定的项目文件夹上单击鼠标右键->本地历史记录-> 您可以看到所有文件。
如果您在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
Run Code Online (Sandbox Code Playgroud)
如果包含工作副本的分区是根分区,它可能拒绝重新安装,然后尝试终止所有服务,如果仍然没有,则关闭并使用Live CD/USB/PXE(如GRML)启动,然后运行以上.我成功地以这种方式恢复了三个丢失的文件中的一个.
小智 5
如果您使用Eclipse 作为 IDE和EGit,则您的文件中的团队菜单:
您将看到所有版本都保存在本地而没有任何保存名称,在我的情况下,您可以轻松地从 git 功能中检查所有未跟踪的更改并恢复丢失的代码。