git原理探索(三)

git版本控制演示

git记录变化的文件快照
git原理探索(三)_第1张图片
  1. 创建如下多级目录结构,根目录 - 2个子目录 - 3个子文件,文件都是有内容的且各不相同。
git原理探索(三)_第2张图片

执行一次提交操作,创建了7个对象,其中3个tree对象、3个blob对象和1个commit对象。

git原理探索(三)_第3张图片
  1. 修改common.js文件,执行提交操作,此时会生成一个新的blob对象,同时引用了该blob的所有tree对象也会重新生成,所以会重新生成4个对象,而未修改的两个文件对应blob对象不变,加上新的commit对象,一共有12个对象。
git原理探索(三)_第4张图片
  1. 创建轻量级的tag对象,生成了一个指针文件,指向了当前的commit对象。
git原理探索(三)_第5张图片
  1. 创建重量级的tag对象,生成了一个tag对象和一个指针文件,指针文件保存了tag对象的引用。
git原理探索(三)_第6张图片
  1. 修改readme.txt文件,此时会生成一个新的blob对象和引用它的根目录对应的tree对象,该tree对象引用的其他对象不变,加上commit对象,一共生成了3个对象,所以总共16个对象。
git原理探索(三)_第7张图片
对象模型变化图

如图显示了三次提交对象的变化情况,第二次提交修改的是最后一个blob对象,第三次提交修改的是第一个blob对象,其中灰色块代表旧版本对象,当前版本不再引用。

git原理探索(三)_第8张图片

版本切换原理

git reset --hard HEAD~1 #回退到上一次提交版本
git reset --hard commitId #切换到指定的版本,commitId就是commit对象的hash值
版本切换实际上是改变当前活动分支的指向,指向其他版本的commitId,然后重新检出HEAD内容(更新工作区)。
根据这个原理我们可以这么做同样达到切换版本的效果:
vim .git/refs/heads/master #修改为你需要切换的commit对象完整hash值
git checkout -f HEAD #重新检出HEAD

版本切换演示

在demo目录下初始化git仓库,然后进行3次提交操作,每次新增一个对应版本的文件进行提交。可以通过git log命令查看提交记录,然后执行git reset操作切换到版本2,对比两个版本的master指向。

git原理探索(三)_第9张图片

此时我们使用另一种方式切换回版本3,使用vim编辑master文件,修改内容为版本3的hash值,然后执行git checkout命令对HEAD进行重新检出,此时工作区的内容就更改回版本3了。

git原理探索(三)_第10张图片

注意:一旦版本回退后,通过git log将无法显示从回退版本到最新版本之间的commit对象 ,可以通过git reflog 查看(显示缩减的hash值)

你可能感兴趣的:(git原理探索(三))