温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:01
呃,然后呢,我们再看一下G是怎么去管理分支的。呃,我们说了这个各个提交对象呢,他们通过副对象的方式呢,建立了一个非常紧密的连接。啊,这个我们其实我们按数据结构上来说呢,这也是一个链表的结构,嗯,比如说这是我们,嗯98C9这个哈,那么第一次提交呢,我们之前给大家看过哈,不知道大家有没有留意它有一个root commit,这就是这个跟提交,你以前从来没有提交过,那么这就是一个跟提交啊root commit,然后呢,你再有提交的话,就会以这个跟提交呢作为它的附节点,就是它,哎然后呢,再提交的话就是它,当我们创建一个分支的时候,大家看我们创建这个就是初始化本地库以后呢,本身就会有master这个分支,然后呢,这个head的这个指针呢,指向我们master。然后呢,如果你创建一个分支呢,要是搁SUV的话呢,它会把文件呢和这个目录哈整个全复制一套,这种方法呢,相比起来简直是太笨了,而我们get怎么办呢?Get非常聪明,我们只是去新建一个指针。
01:15
哎,你看master呢和这个teststing呢,其实呢,都可以看成是指针,跟headde一样都是指针,那么我们这个新建了一个tasting这个分支啊,那么就是多创建一个指针,指向这个某一个版本,你想我创建一个指针和我把所有的文件呢,重新复制一份,这效率可差的太远了,是吧,我可能是能够数据量如果稍微大一点的话,能有几十倍上百倍的这个这个效率上的这个差异啊,我创建一个指针相当于如果是咱们Java哈,你看那就相当于呢,我只是去新建了一个变量,让这个变量呢去指向原来的这个对象啊,那就我就不是去重新用一个对象啊,这个效率要高很多。
02:05
然后呢,这个我切换分支,其实是本质是什么呢?我只是把这个head这个指针原来指向是这个master,我现在指向了这个teststing了,但其实呢,他们指向的版本还是一个版本啊,当然了,因为你head的指针这个变了,你要是再提交的话呢,是会影响这个tasting这个指针,而不会影响master。你看我们这个时候呢,我在pad指向testing的时候,我去提交了新的内容,那么你看这个版本呢,相对于这个旧的版本,它就往前走了一个格,这个时候你看这个master呢,还留在原地,而我这个testing呢,以前已经往前这个走了一步。呃,当我在切换回我master的时候,那就是把这个head指针呢,让它去,呃,重新指向master就好了,所以说你看这个切换它快不快,它必然非常快啊,这必效率必然就特别的高,那我只是只是移动一个指针嘛,那我完全不需要去。
03:10
呃,切换我这个文件啊,就是说这个我完全不涉及到这个文件的这个复制的这个这个这个这个方面,所以说呢,你看我只是非常轻松的移动一下这个指针,我就能够去切换这个分支了。诶,这个时候呢,我这个master呢,如果是在提交一个的时候啊,那这个时候呢,就是testing和master呢,他们分别指向了两个不同的版本,这两个版本呢,他们都是以这个F30AB,诶以它呢为负对象的,诶其实到这儿呢,其实才有一点真正从数据上来说呢,才真正开始这个分叉,从呃我们版本的这个数据上来说啊,到这儿才开始这个分叉,诶你往后呢,你就。进行这个合并啊,其他的这些操作呢,啊,它也是基于这个历史的这个数据啊,基于我们这个指针的这个移动啊,所以说从这儿呢,大家去体会啊,啊这个分支,这个我们get分支的管理,为什么它能够这么高效,为什么它能够这个这么流畅,就是因为呢,呃,它是在文件管理的这个基础之上啊,文件版本管理呢,它就是一个链条啊,在这个链条的基础之上,只不过呢是创建分支,是创建新的指针,切换指针呢,切换分支呢,只不过是切换这个指针它指向的位置,所以说呢,它能够效率非常高啊,非常的操作起来呢也非常的流畅。
我来说两句