Git历史版本的追溯、修改及回滚

系列文章目录

(一)Git本地仓库的初始化和配置
(二)Git文件代码提交详解
(三)Git分支与标签
(四)Git历史版本的回溯、修改及回滚
(五)Git远端同步



一、前言

1. 获取当前版本

通过ref指向的commitID可以获取当前唯一的代码版本

2. 获取历史版本

Commit中会存有Parent Commit字段,通过Commit的串联关系,可获取到历史版本。

二、追溯历史版本

1. 首先使用git log获取最近的提交记录

在这里插入图片描述

2. 使用获取到的commit来获取信息

在这里插入图片描述
可以看到多了一个parent和前一个版本进行串联。

3. 通过parent查看以前的内容

先获取tree
在这里插入图片描述
再根据tree获取文件blob,这样根据blob就能获取以前版本的文件内容了
在这里插入图片描述

三、GIt回滚

1. 命令

git reset --hard commitID

其中commitID可以是上面的parent,也可是是其他节点的commitID
可使用git log获取最近的commitID
在这里插入图片描述

四、Git修改历史版本

1. 命令

git commit --amend

通过这个命令可以修改最近一次commit信息,修改之后ref指向的commitID也会被更改。
在这里插入图片描述
使用git log查看已经被修改,commit也发生了变化,所以之前的commit在哪了呢,这儿就有一个新的概念。

2. 悬空的object

悬空的object就是没有ref指向的object,我们使用以下命令进行查看

git fsck --lost-found

在这里插入图片描述
可以看到上面我们更改后留下的commit变成了悬空的object,也就是没有用的object,我们可以通过git的GC对他进行处理。

3. git gc

通过git gc可以删除一些不必要的东西,也会把现有的object进行打包压缩,减少空间的占有。
在gc之前我们要进行两个操作:

  1. 修改reflog:
    reflog是用来记录操作日志,防止误操作后的数据丢失,通过reflog来找回丢失的数据,我们这儿手动将日志设置为过期
git reflog expire --expire=now --all
  1. 指定gc的时间
    gc默认为修剪两周前的object,我们把它指定为现在
git gc --prune=now

gc之后,可以看到目录结构已经改变了,其实本质上只删除了悬空的object,其他的都打包在.git/packed-refs目录下。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值