文章目录

  • 系列文章目录
  • 一、前言
  • 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获取最近的提交记录

gitea 获取分支版本 java_git

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

gitea 获取分支版本 java_gitea 获取分支版本 java_02


可以看到多了一个parent和前一个版本进行串联。

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

先获取tree

gitea 获取分支版本 java_github_03


再根据tree获取文件blob,这样根据blob就能获取以前版本的文件内容了

gitea 获取分支版本 java_github_04

三、GIt回滚

1. 命令

git reset --hard commitID

其中commitID可以是上面的parent,也可是是其他节点的commitID

可使用git log获取最近的commitID

gitea 获取分支版本 java_github_05

四、Git修改历史版本

1. 命令

git commit --amend

通过这个命令可以修改最近一次commit信息,修改之后ref指向的commitID也会被更改。

gitea 获取分支版本 java_git_06


使用git log查看已经被修改,commit也发生了变化,所以之前的commit在哪了呢,这儿就有一个新的概念。

2. 悬空的object

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

git fsck --lost-found

gitea 获取分支版本 java_回滚_07


可以看到上面我们更改后留下的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目录下。