git 从git log --graph命令输出结果中查看版本进化大致过程以分支合并原理

git 从git log --graph命令输出结果中查看版本进化大致过程

先说说我的操作步骤
(1)首先git init仓库,此时HEAD指向master分支,即此时所在分支为master分支,并在此分支下建立一个名为myfolder的文件夹,然后提交。
(2)建立新的分支test,master和test指向同一个commit对象。
在这里插入图片描述
(3)在test分支下新建1.txt文件,并且提交
在这里插入图片描述

(4)在master分支下新建2.txt,并且提交
在这里插入图片描述

(5)在master分支下,合并test分支
在这里插入图片描述
(6)在test分支下合并master分支
在这里插入图片描述
(7)test 分支下新建3.txt,并且提交
在这里插入图片描述
(8)master分支下合并test
在这里插入图片描述
(9)查看提交记录git log --graph
在这里插入图片描述红色小框框代表master分支指向commit对象的变化,绿色小框框代表test分支指向commit对象的变化。
(10)分支合并原理
a.
在这里插入图片描述
如果 master 分支所在的提交对象是要并入的 test分支的直接上游,Git 只需把master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。
b.在这里插入图片描述
由于当前 master 分支所指向的提交对象(C4)并不是 iss53 分支的直接祖先,Git 不得不进行一些额外处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算。图中用红框标出了 Git 用于合并的三个提交对象,这次,Git 没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)(见图 3-17)。这个提交对象比较特殊,它有两个祖先(C4 和 C5)。
在这里插入图片描述
以上(4)到(5)的合并就是采用的这个过程。