Git-移动记录仪 & 贴心小棉袄 reflog


title: Git-移动记录仪 & 贴心小棉袄 reflog
date: 2018-03-12 23:15:07
tags:

reflog 真是个贴心小棉袄

写在前面

上篇写的是数据删除,这篇的主题,就是数据恢复。学会了这俩,可以更放心大胆的去耍了。

reflog 是什么?

reflog,可以分为两个单词,Reference log,引用日志。当本地仓库中的引用发生移动时,reflog 都会记录下这个移动的行为,跟部移动记录仪差不多。

关于引用是什么?引用的移动是什么?这哥们又是怎么记录这种移动的呢?这些问题先放着,我们先在我的测试项目中,执行下 git reflog 来瞅瞅。

在这里插入图片描述

因为做过很多操作,有很多条记录,数据太多,你可能一下看不懂,所以来化繁为简分析一下,单条记录中每个数据都代表着什么?

  1. 41b9778 是 commit 的 SHA1 值,需要特别注意,它是移动后的 commit。
  2. HEAD@{2} 是标识这是 HEAD 指针2个移动前的指向内容(从当前往回数第3个操作),也就是上面的41b9778
  3. commit 是表示造成这个移动的原因,是进行了 commit 操作。
  4. 创建11.txt文件 表示操作的内容,commit 操作对应的就是 commit message。

单条记录明白之后,再看整体的截图,一目了然。很轻松就知道,我用 Git 到底对这个项目做了什么。

  • 引用是什么?
  • 引用的移动是什么?
  • 这哥们又是怎么记录这种移动的呢?

现在你对这三个问题,有答案了吗?

在上面那副图中,引用指的就是 HEAD 指针;引用的移动就是 HEAD 指针的移动;通过记录操作的命令,操作的次序,操作的内容,操作后的提交信息,来记录这整个操作引起的指针移动行为。

现在我要再问几个问题:

  • 引用除了HEAD 指针,还有其他的吗?
  • 如果有,它们是什么?会被 reflog 记录吗?
  • 如果能被记录,怎么查看?

Reference logs, or “reflogs”, record when the tips of branches and other references were updated in the local repository.

这句话是 git-reflog 官方文档 上对 reflog 的描述,很明确的表达记录的是 “branches and other references(分支或者其他引用)”的更新变化。

所以很明显,引用指的不仅仅是 HEAD 指针,还有分支指针。

git reflog <ref>

<ref> 默认的是 HEAD 指针,如果我们想查看其他的引用,换成对应的内容就可以。

 //查看 master 分支指针的移动记录
 git reflog master

 //查看 feature/test 分支指针的移动记录
 git reflog feature/test

在这里插入图片描述

master 的 re flog

reflog 的治愈力

上篇博客讲过,这是一个比较治愈的命令,为什么呢?因为在误操作丢失数据之后,大多能通过它找回来。
例如:

  • 误删了未合并的分支
  • reset --hard 的时候一不小心HEAD^写成 HEAD^^^,历史倒退太多了
  • 等等,各种失误 & 只是任性的只是想恢复了

这些涉及到指针移动的都可以,全部通过 reflog 找回来。

恢复的流程基本都一样:

第一步:git reflog找回错误操作前的 commit。
第二步:视你自己的需要,对这个提交做点什么。

下面模拟一下,reset 操作和误删分支的恢复流程,感受一下对误操作造成的心灵创伤,reflog 具有的强大治愈力。

  • 恢复reset --hard

1.先模拟一个reset --hard操作。

2.找到 reset 操作前的 commit

3.git reset --hard <commit> 直接恢复操作前的历史。这一步使用 git reset --hard HEAD@{1}也可以,都是一个意思。
在这里插入图片描述

  • 恢复git branch -D <branch>

1.先模拟一个git branch -D <branch操作。
在这里插入图片描述

2.删除操作不会导致 HEAD 指针变化,而且删除之后 feature/test 指针也没了,怎么办呢,这个就要从 HEAD 指针的记录里面翻翻看,找到上次在这个分支上的操作记录。删除分支如果是最新操作过的,一般很好找到。

找到 checkout 的操作,很容易分析出,feature/test 的指针指向的提交是 41b9778

3.git checkout <commit> -b <branch> 将该提交检出为一个新分支,新分支起名为 feature/test ,就相当于误删分支的恢复了。
在这里插入图片描述

写在最后

以上就是本博客的全部内容了,记录的是我自己对 reflog 的理解和使用,希望能带给你们帮助, 如果想知道 reflog 更多的使用方法,小伙伴们自己去看 官方文档 呐,我就不一一说了。

另外,在学习 reflog 的过程中,我有了一个疑问:

丢失的 commit 真的丢了吗?

显然是没丢的,不然谈何恢复,但是它在哪存放着呢?我会一直存在吗?我怎么知道它还在不在呢?

这个疑问,下篇博客《Git-丢失的 commit 是真的消失了吗?》 已经解决,敬请关注,see you next blog~

欢迎订阅我的Git系列文章


欢迎关注个人微信公众号「浅浅同学的开发笔记」,最新的博客,好玩的事情,都会在上面分享,期待与你共同成长。

在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值