1. 理解分⽀
在版本回退⾥,已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即 master 分⽀。再来理解⼀下HEAD,HEAD 严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分⽀。
![](https://i-blog.csdnimg.cn/direct/41a11770d3da447383a01e8b59e502ef.png)
每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越⻓,⽽ HEAD只要⼀直指向master分⽀即可指向当前分⽀。
2. 创建分⽀
Git ⽀持我们查看或创建其他分⽀,在这⾥我们来创建第⼀个⾃⼰的分⽀
dev
,对应的命令为:
![](https://i-blog.csdnimg.cn/direct/2fcdfe1796eb4be7b7d6d8735f2aeaba.png)
当我们创建新的分⽀后,Git 新建了⼀个指针叫 dev,
*
表⽰当前
HEAD
指向的分⽀是
master
分
⽀。另外,可以通过⽬录结构发现,新的
dev
分⽀:
![](https://i-blog.csdnimg.cn/direct/a18521e8b8c94386998f16e8796aa7d0.png)
⼀张图总结:
![](https://i-blog.csdnimg.cn/direct/731b4a16f84143cfbb9a7792d2c1f04e.png)
3. 切换分⽀
那如何切换到 dev 分⽀下进⾏开发呢?使⽤
git checkout
命令即可完成切换,⽰例如下:
![](https://i-blog.csdnimg.cn/direct/db82da04d9f44c59b2596b73e580a7a9.png)
我们发现 HEAD 已经指向了 dev,就表⽰我们已经成功的切换到了 dev 上。
接下来,在
dev
分⽀下修改 ReadMe ⽂件,新增⼀⾏内容,并进⾏⼀次提交操作:
![](https://i-blog.csdnimg.cn/direct/700520ce3b6346da87a14c0776cfc8b6.png)
现在,dev 分⽀的⼯作完成,我们就可以切换回 master 分⽀:
![](https://i-blog.csdnimg.cn/direct/a61c710fb0614955bf1282a6feadc94a.png)
切换回 master 分⽀后,发现ReadMe⽂件中新增的内容不⻅了!!!赶紧再切回 dev 看看:
![](https://i-blog.csdnimg.cn/direct/bbf6e9f67ba447aea08ec85001262650.png)
在 dev 分⽀上,内容还在。为什么会出现这个现象呢?我们来看看 dev 分⽀和 master 分⽀指向,发现两者指向的提交是不⼀样的:
![](https://i-blog.csdnimg.cn/direct/bc57eefd7abb474a90635547649a402b.png)
看到这⾥就能明⽩了,因为我们是在dev分⽀上提交的,⽽master分⽀此刻的提交点并没有变,此时的状态如图如下所⽰:
![](https://i-blog.csdnimg.cn/direct/a3298f842b934a04b07f2fd34d0a8f7d.png)
当切换到 master 分⽀之时,HEAD 就指向了 master,当然看不到提交了!
4. 合并分⽀
为了在 master 主分⽀上能看到新的提交,就需要将
dev
分⽀合并到
master 分⽀,
git merge
命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 dev 分⽀提交的内容
了。
⽰例如下:
![](https://i-blog.csdnimg.cn/direct/da6bc6cd748244948aa24239d8648146.png)
此时的状态如图如下所⽰。
![](https://i-blog.csdnimg.cn/direct/ce3f0f3dc86f4698b844bbd52d7315d1.png)
5. 删除分⽀
合并完成后, dev 分⽀对于我们来说就没⽤了, 那么dev分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀,我们需要在其他分⽀下删除当前分⽀,如:
![](https://i-blog.csdnimg.cn/direct/20f3ca0892f641efb014601504268d9c.png)
此时的状态如图如下所⽰。
![](https://i-blog.csdnimg.cn/direct/aa4e156d7cd54f709dbd0b0326e0fd42.png)
因为创建、合并和删除分⽀⾮常快,所以Git⿎励你使⽤分⽀完成某个任务,合并后再删掉分⽀,这和直接在master分⽀上⼯作效果是⼀样的,但过程更安全。
6. 合并冲突
可是,在实际分⽀合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。为了演⽰这问题,创建⼀个新的分⽀ dev1
,并切换⾄⽬标分⽀,我们可以使⽤
git checkout -
b dev1
⼀步完成创建并切换的动作,⽰例如下:
![](https://i-blog.csdnimg.cn/direct/6b8c3aed873241a7855834d26943c49e.png)
在
dev1
分⽀下修改
ReadMe
⽂件,更改⽂件内容如下,并进⾏⼀次提交,如:
![](https://i-blog.csdnimg.cn/direct/5a5b89b2132248159b0513d1ea7a192a.png)
切换⾄
master
分⽀,观察
ReadMe
⽂件内容:
![](https://i-blog.csdnimg.cn/direct/96c0a56158b14abbad12b9c62ca3a8db.png)
我们发现,切回来之后,⽂件内容由变成了⽼的版本,这种现象很正常,我们现在也完全能理解。 此时在 master 分⽀上,我们对 ReadMe ⽂件再进⾏⼀次修改,并进⾏提交,如下:
![](https://i-blog.csdnimg.cn/direct/a9315eead67642fa85507042e851f771.png)
现在,
master
分⽀和
dev1
分⽀各⾃都分别有新的提交,变成了这样:
![](https://i-blog.csdnimg.cn/direct/6d0ab07084054e14838560cf3d92b5a9.png)
![](https://i-blog.csdnimg.cn/direct/c07079d49b144c84b683100befcc3bb5.png)
发现 ReadMe ⽂件有冲突后,可以直接查看⽂件内容,要说的是 Git 会⽤ <<<<<<<,=======,
>>>>>>> 来标记出不同分⽀的冲突内容,如下所⽰:
![](https://i-blog.csdnimg.cn/direct/550ec9c5ca914fbb8ba013cf3045dadf.png)
此时我们必须要⼿动调整冲突代码,并需要再次提交修正后的结果!
![](https://i-blog.csdnimg.cn/direct/d3dd25431df14cf7b05ab61a85a948b4.png)
到这⾥冲突就解决完成,此时的状态变成了
![](https://i-blog.csdnimg.cn/direct/5c7dc67e0476467f97af70a8c4836b44.png)
⽤带参数的 git log 也可以看到分⽀的合并情况:
![](https://i-blog.csdnimg.cn/direct/cd80caccab56441bafbe7020fbfe500f.png)