git版本回滚的原理
git中有一个全局变量叫HEAD,HEAD这个指针指向的版本就是当前版本。
如果我们需要调出某个版本的记录,需要让HEAD指针指向这个版本,然后再从本地仓库拉取到工作区间就可以了。
git进行版本回滚的方式有三种
- 基于索引值(哈希值)的回滚
- 基于^符号
- 基于~符号
这里我们主要来说一下基于索引值的回滚。
这里要说一个命令,
git reset
我们就是基于这个命令来进行版本前进和后退的。
使用方法通常是
git reset --hard xxxxxxx
这个xxxxxxx就是哈希值的前几位
1.如何查看当前HEAD指向的版本
git reset --hard
如果不设置这个哈希值,那么就是打印出当前HEAD指向的版本。如下
2.如何回退到某个之前的版本
假设我们要回退到,更改内容为add ops comment这个版本,
我们只需要在git reset --hard后面加上这个版本的哈希值的前几位既可以了。如下
接下来只需要查看工作空间的内容就可以了,这个就是当时所在版本的内容。
查看HEAD所执行的版本,发现也没问题。
当然在目前这个版本向,最新提交的版本上切换也是一样的原理。
经过几次的版本切换,这个git reflig的历史日志就比较乱了。
切换到某个版本后,就会把这个版本的日志保留一下。这样会有重复的版本哈希值在上面显示,一般不利于查看。
使用其他方式测没有这个问题。
当然git log 的几种方式查看,还有一个要注意的,就是只能显示当前版本的qia前面的版本log信息。
可以看到,如果我们移动HEAD指针指向非最新的一个版本。使用git log及其变种,都是只能看到,当前版本更后的版本信息。
如果过要向当前版本更前面(如果有)的版本回滚,则还是要使用reflog找到之前的log中文件的的哈希值。
基于^符号的回滚
基于^符号的回滚,只能向后面版本回滚,不能向前面版本回滚。
假设我们要基于当前HEAD指针所在的版本,向后回滚一个版本。
向后回滚一个版本,HEAD后面的就一个^。向后回滚2个,在HEAD后面就使用两个^^。
基于~符号的回滚
和上面的基于^的只能向后的回滚一样,基于~的回滚也是只能向后回滚。
在回滚的版本很多的时候,一般不会写很多个^符号
一般会使用~回滚版本数。
假设我们要在当前版本,向后回滚3个版本。
可以看到是用git log --oneline 查看,相比使用之前,就减少了三个版本。
这里可能你们也看到了使用git log --oneline 查看的,第一行的版本,始终是HAED指针指向的版本,也就是工作空间的版本。