概述:关于git中的reset与checkout的区别
前言:学习了git的命令reset与checkout后,有些傻傻分不清楚两者的区别,大致了解后,想写一篇博来加深理解
正文:
1.reset
如图所示,此图是最后的目的图,博主在学reset命令时所学教材是这样引入reset命令的,在将feature-A与master合并后用了
git reset --hard "原master的哈希值"
并解释到这个命令使其回溯到了feature-A创建之前,然后去创建fix-B,博主想不通的是为何不用checkout命令让其head指向原先的master,然后再建一个新的叫做"fix-B"的分支呢,直到看见下图,为何之前的feature-A以及merge的分支不见了,刚开始以为是书籍方便好看才删除掉的,以为后来会加上,结果查阅一定资料后发现不是,要想再理解需要知道git中的三个区域:工作区域,缓存区,历史记录区,这三个区域不再做解释,请参考如下链接: https://www.cnblogs.com/liujiaq/p/5670069.html
在理解三个区域后,我们可以理解reset究竟有什么作用,如下图所示:
当我们此时HEAD指针指向一个叫Hotfix的分支,我们执行以下命令:
git reset HEAD~2
此时的图将变成:
HEAD与分支都指向了HEAD 2 的位置,如果不知道HEAD2对应哪个位置可以通过
git reflog
查看,不知道细心的同学有没有发现上图中的head2右边的两个分支变模糊了,此处进行了回溯,也可理解为时光倒流,在head2之后的操作可以当作没有进行,但是这些操作有可能会被保存到某个区域里,下面讲一下reset的三个标记--hard,--mixed,--softed。
抽象具体化:个人把这三个区域比作三个不同的时空,而且这三个时空彼此之间可以通过一定的指令来回穿梭(转化)关于转化的关系参考下图:
当使用reset(时空倒流)时,三个不同的标记的作用域也是不同的,如下图所示:
三个标记的作用域如下,三个时空有可能只有一个空间收到了时空倒流的影响,但也有可能所有的时空都会时空倒流。
例:当使用 git reset --soft hash 时另外两个时空是没有受到影响的,缓存区时空还保留着之前的信息即此时那些分支已经被add进入了缓存区时空,若想再恢复历史区的时空,只需要再commit(提交)一次即可
2.checkout
下面讲一下checkout指令如下图所示:
当想将HEAD指向Hotfix时可以用checkout 即:git checkout Hotfix 结果如下图:
Head指针变化了但是没有像reset一样,在head改变指向->hotfix后,在hotfix后创建的分支没有消失,这是checkout与reset最大的区别,如果上文中像我讲到用 git checkout master的指令那么master后的feature-A是不会消失的。
关于reset的特点,个人用了时间与空间上的具体概念来解释但觉得可能对于很多人来说还是有些抽象,下面举一个例子来加深理解:假如在历史记录区已经存在了 1 2 3 这些分支,这三个文件commit的顺序依次为1,2,3。设1对应的hash值为1998 此时我们执行 git reset --hard 1998 执行以后,因为hard的作用域包括了所有区域,所以如果希望再次将2 与3依次加入,需要从头开始加入包括里面的文件(add与commit),若此时为--soft标记因为在缓存区中还没有回溯,所以只需要再进行commit即可。
本文参考链接:https://www.cnblogs.com/houpeiyong/p/5890748.html
结语:感觉git中的一些原理结构确实很抽象,希望大家能多多交流共同进步