1,分支指针指向的是该分支下的最近一次提交
首先git上现有一个readme.txt文件,存在如下一条主分支线:
master
/
C0 —- C1 —- C2 —- C3
master指向最近的一次提交(commit),即readme.txt的C3版本
readme.txt内容如下:
C0
C1
C2
C3
此时在git bash,输入如下命令,新建一个分支branch1,并切换到该分支下:
git branch branch1 #创建新分支branch1
git checkout branch1 #切换到分支branch1下
还可以用另一种方式创建并切换一个新分支下branch2:
git checkout master #切换到master下创建新分支
git checkout -b branch2 #创建并切换到分支branch2下
建好后查看当前分支:
git branch
输出出结果如下:
branch1
*branch2
master
其中branch2前有*标出,代表我们当前所处分支位置为branch2
这时,前面分支图实际上变成了:
master
/
C0 —- C1 —- C2 —- C3——branch1
\
branch2
这时候什么都没干就已经有了三个分支,接下来这几个分支会发挥什么样的作用呢?
现在既然在分支branch2下,就在branch2下用vi 在readme.txt文件中加入一句内容:
in branch2
这时分别用git checkout 命令切换到master和branch1分支下(有时会有提示信息不让切换,如果能切换时)可以查看readme.txt 文件会发现这两个分支下的readme.txt也加上了“in branch2”这句话,为什么在branch2下修改的文件也会影响到master和branch1了呢?
这是因为此时的修改改的是工作区中的文件,即本地文件readme.txt,这份在branch2下的修改并未提交(commit),只要不提交,工作区的变化还不能关联任何一个分支指针,此时master、branch1、branch2三个分支指针实际上还是都指向readme.txt的最近一次提交C3版,工作区中的变化和在哪个分支没有关系。分支指针只指向该分支下的最近一次提交(commit),与提交有关系。
既然提交就可以了,那把在branch2下的修改切换到branch3下进行提交可以吗?不可以,在branch2下发生修改未提交时,在branch3下也能看到,如果在branch3下提交就变成branch3跟踪下变化的版本了。
在branch2下使用下列命令提交修改“in branch2”:
git add readme.txt #将修改记录在暂缓区
git commit -m "change message:in branch2" #将暂缓区的修改全部提交
这时,如果在git checkout 到各个分支下查看就会发现,只有branch2 下的readme.txt里多了一句“in branch2”了,此时分支图已经变成了:
master
/
C0 —- C1 —- C2 —- C3——branch1
\
C4—-branch2
这里的C4就是最新提交的”change message:in branch2” 那一版。
2,冲突是发生在文件同一个位置的修改
参照上面的操作,git checkout 切换到branch1 下,也对readme.txt 进行修改,添加一句“in branch1”,并提交,此时分支图就成了:
master
/
C0 —- C1 —- C2 —- C3 —- C5——branch1
\
C4—-branch2
此时readme.txt在三个分支下有三个版本,
master分支下的C3版readme.txt内容如下:
C0
C1
C2
C3
branch1分支下的C5版readme.txt内容如下:
C0
C1
C2
C3
in branch1
branch2分支下的C4版readme.txt内容如下:
C0
C1
C2
C3
in branch2
假如要将分支branch1合并到主分支master上,可以切换到master分支下输入命令:
git merge branch1
屏幕输出结果会显示
$ git merge dev Updating d17efd8..fec145a Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)
注意Fast-forward,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向branch1的当前提交,所以合并速度非常快。
合并后的分支图如下所示:
master
/
C0 —- C1 —- C2 —- C3 —- C5——branch1
\
C4—-branch2此时master下的readme.txt内容就会与branch1下的readme.txt一样了。
假如是branch1和branch2 先合并会发生什么?
先git checkout 到branch2下输入分支合并命令:git merge branch1
这时会告诉我们发生了冲突:
Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result.
为什么会发生冲突?因为C4版的readme.txt和C5版的readme.txt都在文件第5行添加了一句话,而且两句话的内容还不相同,这时用vi 打开readme.txt,会发现readme.txt文件内容已经成了:
C0
C1
C2
C3
<<<<<<< HEAD
in branch2
\========
in branch1
>>>>>>> branch1Git用<<<<<<<,=======,>>>>>>>标记区分出不同分支的内容。在当前分支即branch2下对readme.txt直接修改,修改成自己想要的合并效果,如删除<<<<<<< HEAD、========、>>>>>>> branch1 这些行,将in branch2和in branch1 合并修改成一行为:in branch, 然后保存,提交(commit)即可。
分支图如下所示:
master
/
C0 —- C1 —- C2 —- C3 —- C5——branch1
\ \
C4—- C6—-branch2在branch2下使用如下图所示的命令可以查看分支合并的过程:
$ git log --graph --pretty=oneline --abbrev-commit * 59bc1cb conflict fixed |\ | * 75a857c AND simple * | 400b400 & simple |/ * fec145a branch test