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

译者注: 原书这里只有两个链接: Recovering Lost Commits Blog Post,Recovering 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也行就能把它们给恢复。

git中找回丢失的对象相关推荐

  1. Git 内部原理图解——对象、分支以及如何从零开始建仓库

    我们中的许多人每天都在使用  git,但是有多少人知道它的内部是怎么运作的呢? 例如我们使用  git commit  时发生了什么?提交(commit)与提交之间保存的是什么?两次提交之间难道只是文 ...

  2. git合并丢失代码问题分析与解决

    git合并丢失代码问题分析与解决(错误操作导致) git revert后导致合并代码丢失 起因 我有一个开发分支antd3.x和一个主分支develop,我在合并antd3.x到develop的时候发 ...

  3. Git 系列(七):使用 Git 管理二进制大对象

    通过这系列的前六篇文章,我们已经学会使用 Git 来对文本文件进行版本控制的管理.我们不禁要问,还有二进制文件呢,也可进行进行版本控制吗?答案是肯定的,Git 已经有了可以处理像多媒体文件这样的二进制 ...

  4. Git系列(七):使用Git管理二进制大对象

    通过这系列的前六篇文章,我们已经学会使用 Git 来对文本文件进行版本控制的管理.我们不禁要问,还有二进制文件呢,也可进行进行版本控制吗?答案是肯定的,Git 已经有了可以处理像多媒体文件这样的二进制 ...

  5. git 提交丢失Warning, you are leaving 2 commits behind,

    早上在自己的一个版本代码上编辑,提交commint,但是checkout到其他分支再checkout回来发现该的东西不见了, 幸好terminal还没有关掉,回看日志: Warning: you ar ...

  6. 记一次尴尬的git reset丢失分支故障

    最近...似乎一直在踩坑... 也不是什么故障,只是把一个分支的功能弄没了,之后在reflog里找到又恢复了. 产生原因是有同事错误地把分支B merge到了分支A并push. 我直接在分支A上res ...

  7. Sybase数据库中找回丢失的sa密码

    2019独角兽企业重金招聘Python工程师标准>>> 1.在Sybase目录的install子目录的启动server文件 RUN_server(这里的server表示你的服务器名称 ...

  8. Git超详细学习笔记 手把手带你一步一步操作 -- 详细分析git 对象-域-分支以及github使用

    Git 使用笔记 详细的说明文档: 请参考安装目录下的doc文档 D:\Program Files\Git\mingw64\share\doc\git-doc\git-stash.html git 版 ...

  9. 查看git当前tag_git对象浅析

    git对象是什么 git中有个叫做.git/objects的文件夹被称为git的数据库或者对象库,里面存在着好多以两位十六进制的目录如29,目录中会有一些文件,文件名是01e239516f4f92d0 ...

最新文章

  1. Session和几种状态保持方案理解
  2. 1200+标星,3千多人点赞,这本书让你系统了解机器学习可解释性丨开源免费阅读...
  3. 转载:工程师笔记|STM32F030在低温下无法启动
  4. myabatis oracle 调用存储过程返回list结果集
  5. 数据库高可用架构 转载
  6. 苹果手机自带表格软件_解决手机系统自带软件无法卸载问题
  7. C++_类和对象_封装_案例_立方体类_案例点和圆的关系---C++语言工作笔记039
  8. Spring-@Value
  9. Java Android客户端开发
  10. nodejs学习笔记-1-文件系统
  11. Ucinet软件使用
  12. ie浏览器服务器无响应怎么办,ie浏览器无响应怎么办
  13. u盘文件名乱码linux,U盘文件名乱码的原因和解决办法
  14. 安防网络摄像头海康大华硬盘录像机视频流媒体服务器EasyNVR调用接口时提示未授权问题解决方案
  15. Git(分布式版本控制工具)
  16. 【综述】植物防御假说——Out of the quagmire of plant defense hypotheses
  17. DAO层,Service层,Controller层的作用
  18. casewhen多条件查询_Mybatis(三)- MyBatis 多条件查询和模糊查询实例
  19. 建行找不到服务器或DNS错误,建行浏览器打不开,提示域名解析错误,代码105,怎么解决?谢谢...
  20. ETF基金定投数据分析1——数据收集

热门文章

  1. WIN配置git 配置后失败 can't be established
  2. idea/eclipse下Maven工程集成web服务(tomcat、jetty)
  3. Yii2多模型与事务的用法
  4. Redis+keepalived 主从搭建
  5. MongoDB内存映射文件
  6. 处理字符数据--运算符和函数
  7. Exchange证书生成器
  8. 单片机sleep函数的头文件_单片机学习day8—单片机IO扩展
  9. 互联网协议 — GRE 通用路由封装协议
  10. 为什么说 TCP/IP 是一个不确定性网络