zoukankan      html  css  js  c++  java
  • git中找回丢失的对象

    本文转载自:http://gitbook.liuhui998.com/5_9.html

    译者注: 原书这里只有两个链接: Recovering Lost Commits Blog PostRecovering Corrupted Blobs by Linus
    我根据第一个链接,整理了一篇博文,并把它做为原书补充。
    一、前言
    在玩git的过程中,常有失误的时候,有时把需要的东东给删了。 不过没有关系,git给了我们一层安全网,让们能有机会把失去的东东给找回来。
    二、准备
    我们先创建一个用以实验的仓库,在里面创建了若干个提交和分支。 BTW:你可以直接把下面的命令复制到shell里执行。
    mkdir recovery;cd recovery
    git init
    touch file
    git add file
    git commit -m "First commit"
    echo "Hello World" > file
    git add .
    git commit -m "Greetings"
    git branch cool_branch 
    git checkout cool_branch
    echo "What up world?" > cool_file
    git add .
    git commit -m "Now that was cool"
    git checkout master
    echo "What does that mean?" >> file
    三、恢复已删除分支提交
    现在repo里有两个branch
    $ git branch
    cool_branch
    * master
    存储当前仓库未提交的改动
    $ git stash save "temp save"
    Saved working directory and index state On master: temp save
    HEAD is now at e3c9b6b Greetings
    删除一个分支
    $ git branch -D cool_branch
    Deleted branch cool_branch (was 2e43cd5).
    $ git branch
     * master
    用git fsck --lost-found命令找出刚才删除的分支里面的提交对象。
     
    $git fsck --lost-found
      dangling commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
    用git show命令查看一个找到的对象的内容,看是否为我们所找的。
    git show 2e43cd56ee4fb08664cd843cd32836b54fbf594a
     
      commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
      Author: liuhui <liuhui998[#]gmail.com>
      Date:   Sat Oct 23 12:53:50 2010 +0800
     
      Now that was cool
     
      diff --git a/cool_file b/cool_file
      new file mode 100644
      index 0000000..79c2b89
      --- /dev/null
      +++ b/cool_file
      @@ -0,0 +1 @@
      +What up world?
    这个提交对象确实是我们在前面删除的分支的内容;下面我们将考虑一下要如何来恢复它了。
    使用git rebase命令来恢复
      $git rebase 2e43cd56ee4fb08664cd843cd32836b54fbf594a
      First, rewinding head to replay your work on top of it...
      Fast-forwarded master to 2e43cd56ee4fb08664cd843cd32836b54fbf594a.
    现在我们用git log命令看一下,看看它有没有恢复:
      $ git log
     
      commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
      Author: liuhui <liuhui998[#]gmail.com>
      Date:   Sat Oct 23 12:53:50 2010 +0800
     
      Now that was cool
     
      commit e3c9b6b967e6e8c762b500202b146f514af2cb05
      Author: liuhui <liuhui998[#]gmail.com>
      Date:   Sat Oct 23 12:53:50 2010 +0800
     
      Greetings
     
      commit 5e90516a4a369be01b54323eb8b2660545051764
      Author: liuhui <liuhui998[#]gmail.com>
      Date:   Sat Oct 23 12:53:50 2010 +0800
     
      First commit
    提交是找回来,但是分支没有办法找回来:
      liuhui@liuhui:~/work/test/git/recovery$ git branch
      * master
    我们也可以使用以下命令来把刚才的恢复的提交删除
      $ git reset --hard HEAD^
      HEAD is now at e3c9b6b Greetings
    再把刚删的提交给找回来:
      git fsck --lost-found
      dangling commit 2e43cd56ee4fb08664cd843cd32836b54fbf594a
    不过这回我们用是合并命令git merge来进行恢复:
      $ git merge 2e43cd56ee4fb08664cd843cd32836b54fbf594a
      Updating e3c9b6b..2e43cd5
      Fast-forward
      cool_file |    1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
      create mode 100644 cool_file
    六、git stash的恢复
    前面我们用git stash把没有提交的内容进行了存储,如果这个存储不小心删了怎么办呢?
    假如当前repo里有的存储:
    $ git stash list
    stash@{0}: On master: temp save
    把它们清空:
    $git stash clear
    liuhui@liuhui:~/work/test/git/recovery$ git stash list
    再用git fsck --lost-found找回来:
    $git fsck --lost-found
    dangling commit 674c0618ca7d0c251902f0953987ff71860cb067
    用git show看一下回来的内容对不对:
    $git show 674c0618ca7d0c251902f0953987ff71860cb067
     
    commit 674c0618ca7d0c251902f0953987ff71860cb067
    Merge: e3c9b6b 2b2b41e
    Author: liuhui <liuhui998[#]gmail.com>
    Date:   Sat Oct 23 13:44:49 2010 +0800
     
        On master: temp save
     
    diff --cc file
    index 557db03,557db03..f2a8bf3
    --- a/file
    +++ b/file
    @@@ -1,1 -1,1 +1,2 @@@
      Hello World
      ++What does that mean?
    看起来没有问题,好的,那么我就把它恢复了吧:
    $ git merge 674c0618ca7d0c251902f0953987ff71860cb067
    Merge made by recursive.
     file |    1 +
      1 files changed, 1 insertions(+), 0 deletions(-)
    七、其他
    其实git中找回丢失的对象,这里最重要的一个命令就是:git fsck --lost-found,因为git中把commit删了后,并不是真正的删除,而是变成了悬空对象(dangling commit)。我们只要把把这悬空对象(dangling commit)找出来,用git rebase也好,用git merge也行就能把它们给恢复。
     
     
     
     
     
  • 相关阅读:
    Atitit 趋势管理之道 attilax著
    Atitit 循环处理的新特性 for...else...
    Atitit 2017年的技术趋势与未来的大技术趋势
    atitit 用什么样的维度看问题.docx 如何了解 看待xxx
    atitit prj mnrs 项目中的几种经理角色.docx
    Atitit IT办公场所以及度假村以及网点以及租房点建设之道 attilax总结
    Atitit 工具选型的因素与方法 attilax总结
    Atitit.团队文化建设影响组织的的一些原理 法则 定理 效应 p826.v4
    Atiitt 管理方面的误区总结 attilax总结
    Atitit 未来趋势把控的书籍 attilax总结 v3
  • 原文地址:https://www.cnblogs.com/xingzc/p/5987048.html
Copyright © 2011-2022 走看看