git版本控制演示
git记录变化的文件快照
- 创建如下多级目录结构,根目录 - 2个子目录 - 3个子文件,文件都是有内容的且各不相同。
执行一次提交操作,创建了7个对象,其中3个tree
对象、3个blob
对象和1个commit
对象。
- 修改common.js文件,执行提交操作,此时会生成一个新的
blob
对象,同时引用了该blob
的所有tree
对象也会重新生成,所以会重新生成4个对象,而未修改的两个文件对应blob
对象不变,加上新的commit
对象,一共有12个对象。
- 创建轻量级的
tag
对象,生成了一个指针文件,指向了当前的commit
对象。
- 创建重量级的
tag
对象,生成了一个tag
对象和一个指针文件,指针文件保存了tag
对象的引用。
- 修改readme.txt文件,此时会生成一个新的
blob
对象和引用它的根目录对应的tree
对象,该tree
对象引用的其他对象不变,加上commit
对象,一共生成了3个对象,所以总共16个对象。
对象模型变化图
如图显示了三次提交对象的变化情况,第二次提交修改的是最后一个blob
对象,第三次提交修改的是第一个blob
对象,其中灰色块代表旧版本对象,当前版本不再引用。
版本切换原理
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指向。
此时我们使用另一种方式切换回版本3,使用vim编辑master
文件,修改内容为版本3的hash
值,然后执行git checkout
命令对HEAD
进行重新检出,此时工作区的内容就更改回版本3了。
注意:一旦版本回退后,通过git log
将无法显示从回退版本到最新版本之间的commit
对象 ,可以通过git reflog
查看(显示缩减的hash值)
网友评论