系列文章目录
(一)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之前我们要进行两个操作:
- 修改reflog:
reflog是用来记录操作日志,防止误操作后的数据丢失,通过reflog来找回丢失的数据,我们这儿手动将日志设置为过期
git reflog expire --expire=now --all
- 指定gc的时间
gc默认为修剪两周前的object,我们把它指定为现在
git gc --prune=now
gc之后,可以看到目录结构已经改变了,其实本质上只删除了悬空的object,其他的都打包在.git/packed-refs目录下。