意外结账后取回更改?

Aut*_*act 58 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")
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)的"本地历史记录"恢复更改.真是太幸福了!

  • 你救了我的命!要在JetBrains中执行此操作,请转到VCS菜单> Local Histroy (6认同)
  • 使用Sublime Text 3,我丢失的文件中的ctrl + z足以恢复它们.</恐慌> (4认同)
  • 您也可以在 Eclipse 中通过右键单击文件并转到“团队-&gt;显示本地历史”来执行此操作。 (2认同)
  • 只需 Cmd+Z 和“从磁盘重新加载撤消”就可以在 IntelliJ Idea 中拯救我 (2认同)

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使用' '作为"检查点技术" .

stason提出的意见:

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 othernamerm -fr othername.
但是,get checkout foo根据当前目录中是否存在名为foo的文件," "完成两个完全不同的事情之一是不对的.


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

  • 这个别名似乎有效: `co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$*\""` 注意,我添加了一条消息来告诉其他人的备份存储。 (2认同)
  • @stason 谢谢。我已经相应地编辑了答案。 (2认同)

Gre*_*ill 22

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

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

  • 我真的希望git这样做.当我切换分支时,我发现在打扰我的工作时,我觉得很烦人.我希望能够输入"混帐结账富; git的结帐吧",并假设我开始支杆上,用我的索引和工作目录,最终在它到底是命令前的状态,不管是什么我已修改,我已经添加到索引等等 (3认同)

小智 18

如果您使用IntelliJ Idea,您可以在选定的项目文件夹上单击鼠标右键->本地历史记录-> 您可以看到所有文件。

  • 这对我很有用:) (3认同)
  • 你救我。非常感谢。这是个好主意。我丢失了文件,并且无法记住文件的路径以通过本地历史记录恢复它们,但这个建议帮助我记住了结构和名称。 (2认同)

小智 11

使用VS Code,可以通过 CTRL+Z 顺利地将本地更改从磁盘取回。所以尝试使用IDE。


ale*_*xei 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
    
    Run Code Online (Sandbox Code Playgroud)

    如果包含工作副本的分区是根分区,它可能拒绝重新安装,然后尝试终止所有服务,如果仍然没有,则关闭并使用Live CD/USB/PXE(如GRML)启动,然后运行以上.我成功地以这种方式恢复了三个丢失的文件中的一个.


小智 5

如果您使用Eclipse 作为 IDEEGit,则您的文件中的团队菜单:

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

您将看到所有版本都保存在本地而没有任何保存名称,在我的情况下,您可以轻松地从 git 功能中检查所有未跟踪的更改并恢复丢失的代码。