之前的篇幅里没有过多提到分支的概念,但是多多少少看到了master,head这两个字眼,其中master就是当前主分支,而head指向了master这条主分支,我们通过图示来了解一下:
当我们新建test文件:
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 (HEAD -> master) 创建test
当我们在test文件里面添加了 aaa:
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 (HEAD -> master) 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
当我们在test文件里面添加了bbb:
0e4f25cbc0cc15c5513a5af1696f8c9244ff15f1 (HEAD -> master) 添加了bbb
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
当我们在test文件里添加了ccc:
39b320cba40b7c2638629b8bcc508fac134c7fcc (HEAD -> master) 添加了ccc
0e4f25cbc0cc15c5513a5af1696f8c9244ff15f1 添加了bbb
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
可以知道每次提交,master都会指向最新的提交,随着提交的次数越来越多,这条master分支也会越来越长
创建新的分支你可以简单的理解为原本只是你一个人在master分支上进行,现在又来了一个小伙伴要和你一起进行协作开发,所以他会创建一个新的分支叫做testing:
$ git branch testing
我们打印下日志,看看当前有几个分支,从图上可以看到HEAD 当前指向的是master,而master和testing指向的是同一个commit 版本:
要是觉得commit ID有点长的话,还有另一个命令可以看起来更简洁:
$ git log --oneline --decorate
39b320c (HEAD -> master, testing) 添加了ccc
0e4f25c 添加了bbb
8cc102e 添加 aaa
11530d0 创建test
我们从这里就可以感受到git的威力,不管多少人开发,也就只是创建了一个指针,而不需要复制整个项目。那么我现在想切换到test分支:
$ git checkout testing //切换到test分支
Switched to branch 'testing' //打印的消息
假如你想新建并切换分支的话可以这么做:
git checkout -b testing
再来查看一下日志,发现HEAD指向了testing 分支,而不是master分支了:
$ git log --oneline --decorate
39b320c (HEAD -> testing, master) 添加了ccc
0e4f25c 添加了bbb
8cc102e 添加 aaa
11530d0 创建test
既然来到了testing 分支,就在这里对test文件修改一下,添加ddd:
$ git log --pretty=oneline --decorate
f3105048c31804acba5ad17b8b1a23dd77f16fac (HEAD -> testing) 在testing分支上创建了ddd
39b320cba40b7c2638629b8bcc508fac134c7fcc (master) 添加了ccc
0e4f25cbc0cc15c5513a5af1696f8c9244ff15f1 添加了bbb
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
现在看下指针图示:
接下来我们再切换到master分支,然后再master分支上再次修改下test文件,添加eee,注意上图原先master是指向(添加了ccc):
b11a427e8d40ab05ba4be1a0d2bc5ad5c86fff06 (HEAD -> master) 我在master分支创建了ee e
39b320cba40b7c2638629b8bcc508fac134c7fcc 添加了ccc
0e4f25cbc0cc15c5513a5af1696f8c9244ff15f1 添加了bbb
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
f3105048c31804acba5ad17b8b1a23dd77f16fac (HEAD -> testing) 在testing分支上创建了 ddd
39b320cba40b7c2638629b8bcc508fac134c7fcc 添加了ccc
0e4f25cbc0cc15c5513a5af1696f8c9244ff15f1 添加了bbb
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
$ git checkout master //我是要把其他分支全部合并到master,所以必须先检出到master分支
2:开始合并,很明显合并出错了,因为我在master分支修改test文件,是在第四行添加了eee,而在testing分支修改test文件也是在第四行添加了ddd,所以出现了冲突:
$ git merge testing
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
那么接下来是要解决冲突了,我们先来看看合并分支之后的内容是啥,小于号和等于号之间的表示head分支的内容,大于号和等于号之间的表示testing 分支的内容,也是指的冲突内容:
$ cat test.txt
aaa
bbb
ccc
<<<<<<< HEAD
eee
=======
ddd
>>>>>>> testing
之前没合并的时候master分支test文件的内容:
aaa
bbb
ccc
eee
之前没合并的时候testing分支test文件的内容:
aaa
bbb
ccc
ddd
通过git status 查看一下当前问题:
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: test.txt //说明了两个人都修改了test文件,然后再根据上面的冲突显示内容定位到冲突具体位置
既然我们定位到了问题,知道我和别人的冲突在哪里,那么一定要沟通一下,手动解决冲突,沟通之后文件改成如下:
aaa
bbb
ccc
eee
ddd
然后添加并提交到版本库,接下来我们再打印下日志看看,发现HEAD指向了master分支,分支的冲突也不存在了:
$ git status
On branch master
nothing to commit, working tree clean
$ git log --pretty=oneline --decorate
b136061db208a88d5c1d2578d7a20e36d73d1c4e (HEAD -> master) 解决了testing分支和mas ter分支的冲突
b11a427e8d40ab05ba4be1a0d2bc5ad5c86fff06 (test.txt) 我在master分支创建了eee
f3105048c31804acba5ad17b8b1a23dd77f16fac (testing) 在testing分支上创建了ddd
39b320cba40b7c2638629b8bcc508fac134c7fcc 添加了ccc
0e4f25cbc0cc15c5513a5af1696f8c9244ff15f1 添加了bbb
8cc102e47ad0c75df5508e2769b1a97bf128dbf9 添加 aaa
11530d0ccfa93e5b258a7fbe4ef0159d9f008618 创建test
文件最终的内容如下:
$ cat test.txt
aaa
bbb
ccc
eee
ddd
最后删除 testing 分支即可:
$ git branch -d testing
Deleted branch testing (was f310504).
最后使用git branch命令来查看一下分支列表:
$ git branch
* master
test.txt
上一篇:史上最简单的git教程|第七篇:远程仓库关联本地、克隆仓库
下一篇:史上最简单的git教程|第九篇:分支管理工具
–
如果有小伙伴觉得我写的不错的话可以关注一下我的博客,我会一直持续更新,也可以支持一下我的公众号哦:java架构师小密圈,会分享架构师所必须深入研究的技术,比如netty,分布式,性能优化,spring源码分析,mybatis源码分析,等等等,同时还会分享一些赚钱理财的小套路哦,欢迎大家来支持,一起学习成长,程序员不仅仅是搬瓦工!
公众号:分享系列好文章