史上最简单的git教程|第八篇:创建和合并分支、解决冲突、删除分支

一:理解分支的概念

     之前的篇幅里没有过多提到分支的概念,但是多多少少看到了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分支也会越来越长

史上最简单的git教程|第八篇:创建和合并分支、解决冲突、删除分支_第1张图片


二:创建新的分支

     创建新的分支你可以简单的理解为原本只是你一个人在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

     现在看下指针图示:
史上最简单的git教程|第八篇:创建和合并分支、解决冲突、删除分支_第2张图片
     接下来我们再切换到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教程|第八篇:创建和合并分支、解决冲突、删除分支_第3张图片

三:合并分支

  1. 首先你先要确定分支合并到哪条分支
$ 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

     合并之后的指针图如下:
史上最简单的git教程|第八篇:创建和合并分支、解决冲突、删除分支_第4张图片

     最后删除 testing 分支即可:

$ git branch -d testing
Deleted branch testing (was f310504).

     最后使用git branch命令来查看一下分支列表:

$ git  branch
* master
  test.txt


上一篇:史上最简单的git教程|第七篇:远程仓库关联本地、克隆仓库
下一篇:史上最简单的git教程|第九篇:分支管理工具


如果有小伙伴觉得我写的不错的话可以关注一下我的博客,我会一直持续更新,也可以支持一下我的公众号哦:java架构师小密圈,会分享架构师所必须深入研究的技术,比如netty,分布式,性能优化,spring源码分析,mybatis源码分析,等等等,同时还会分享一些赚钱理财的小套路哦,欢迎大家来支持,一起学习成长,程序员不仅仅是搬瓦工!
公众号:分享系列好文章
史上最简单的git教程|第八篇:创建和合并分支、解决冲突、删除分支_第5张图片

交流群:群友互相分享资料
史上最简单的git教程|第八篇:创建和合并分支、解决冲突、删除分支_第6张图片

你可能感兴趣的:(git学习心得,Git)