代码之家  ›  专栏  ›  技术社区  ›  millisami

意外签出后是否取回更改?

  •  52
  • millisami  · 技术社区  · 16 年前

    以下是我的回购协议的状态。

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

    我能把零钱拿回来吗?

    7 回复  |  直到 7 年前
        1
  •  44
  •   VonC    7 年前

    我不认为您可以恢复这些私有数据(“private”和“not added in the index,nor committed”,git不知道),除非您为当前工作目录准备了其他备份过程。

    即使在 Git Aliases page ,我会为结帐(比如 alias rm /bin/rm -i 用途:

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

    与' git stash; git stash apply “作为”检查点技术“被 Brian Campbell 在里面 his answer .

    stason 提议 in the comments :

    co = "!git stash push -m \"co backup\"; git stash apply; git checkout \"$@\"" 
    

    注意,我添加了一条消息来告诉其他人备份存储。艾斯

    这个问题让我想起了一场关于 ycombinator (摘录):


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

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


    可能很烦人,但这是用户错误,而不是设计错误。有了Git,如果我想无损地丢弃我的工作副本,我可以” git stash “。
    根据你的逻辑,“rm”是有缺陷的,因为它不会在你通过时要求确认。 -f 而不是 -i . 嗯,是的。对不起的。


    如果 rm somename 相当于 apt-get update rm othername rm -fr othername .
    但是,这不可能是正确的。” get checkout foo “根据当前目录中是否存在名为foo的文件,是否执行两种完全不同的操作之一?


    还有一个疯狂的想法:不要跑 git checkout ... “在肮脏的工作树上。问题解决了。
    另一个:不要将文件名重用为分支名称。
    老实说,我也有同样的问题,粗心地调用' rm “毁了我的一天,但当我咕哝着诅咒的时候,那是因为我的懒惰/愚蠢,而不是因为巴什的完成或他的行为。” RM

        2
  •  46
  •   donturner    12 年前

    另一件事你可以看通过你的IDE。我意外地签出了2个文件,并且能够通过我的IDE(NetBeans)的“本地历史”恢复更改。多幸运啊!

        3
  •  20
  •   Greg Hewgill    16 年前

    除非你曾经用过 git add git stash 对于以前的文件,不幸的是没有。如果您已经添加或存储了这些文件,那么您应该能够通过 git reflog .

    我从来没有对这种破坏性的行为感到满意 git checkout . 一个有用的增强可能是 GIT校验 在覆盖您的工作之前,自动创建一个隐藏(以便通过reflog捕获文件)。

        4
  •  5
  •   alexei Shaun07776    11 年前

    以下可能适用于在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
      

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

        5
  •  3
  •   Jonathan    9 年前

    如果你使用 作为IDE的Eclipse 埃吉特 ,您的文件中有团队菜单:

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

    在我的例子中,您将看到所有版本都在本地保存,没有任何保存名称,但是,您可以很容易地从Git特性中检查所有未跟踪的更改,并恢复丢失的代码。

        6
  •  0
  •   Sushil88    8 年前

    对于git命令,您没有什么可以做的,但是如果您使用的是IDE,那么您可以恢复您的更改。 我在使用phpsorm,在这里我们可以看到文件更改历史记录。 只需右键单击文件,然后单击显示本地历史记录。 在“外部更改”选项卡下,可以找到意外删除的本地更改。

        7
  •  0
  •   ShankarDaruga    7 年前

    如果您使用的是IDE,并且它有“撤消”选项,只需撤消更改,它将撤消从磁盘重新加载,这将恢复您的更改。大多数IDE/编辑器都有这个选项。

    推荐文章