系列文章目录
(一)Git本地仓库的初始化和配置
(二)Git文件代码提交详解
(三)Git分支与标签
(四)Git历史版本的回溯、修改及回滚
(五)Git远端同步
文章目录
- 系列文章目录
- 一、前言
- 1. 获取当前版本
- 2. 获取历史版本
- 二、追溯历史版本
- 1. 首先使用git log获取最近的提交记录
- 2. 使用获取到的commit来获取信息
- 3. 通过parent查看以前的内容
- 三、GIt回滚
- 1. 命令
- 四、Git修改历史版本
- 1. 命令
- 2. 悬空的object
- 3. git gc
一、前言
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之前我们要进行两个操作:文章来源:https://uudwc.com/A/qkWP
- 修改reflog:
reflog是用来记录操作日志,防止误操作后的数据丢失,通过reflog来找回丢失的数据,我们这儿手动将日志设置为过期
git reflog expire --expire=now --all
- 指定gc的时间
gc默认为修剪两周前的object,我们把它指定为现在
git gc --prune=now
gc之后,可以看到目录结构已经改变了,其实本质上只删除了悬空的object,其他的都打包在.git/packed-refs目录下。文章来源地址https://uudwc.com/A/qkWP