一、什么是分支?
分支可以简单的理解为分叉,在主干上长出一条枝干出来,主干分支通常叫做master
,master
分支其实和以后我们自己创建的分支没有什么区别,只不过master
分支是git
在初始化的时候自动就创建出来了的。在主分支上可以开很多分支出来,不同的人在不同的分支上做开发,最后合并到主分支,这样不会相互影响。
这么说可能比较的抽象,结合着具体场景解释就是:比如我们在写代码的时候,已经做完了一系列的开发了。相当于已经可以形成一个比较稳定完整的版本。这个时候项目需求又发生了变化,这就需要改动之前的代码。这个时候就会有纠结点。改动之前的代码势必会影响之前的版本稳定。最好的方式就是,稳定的版本继续运行,不去改变它,我们在继续开发新需求的版本,当新需求的版本测试到位之后,再替换之前的版本。
如果没有版本控制会怎么做呢?只能是之前开发的一个版本不去动,然后我们再起一个新的工程,然后在新工程上进行迭代。迭代好之后,再用新工程的版本去替代原来工程的版本。如果某一天又想换回来,又用原来的工程替换新的工程就行了
其实使用了版本控制,就是想要解决这种麻烦的事情。让我们便于在各个版本之间切换。这种切换,在git中使用的就是分支
分支的整个过程,其实就是一个工作流的过程,在Github官网,解释的已经很清楚了
二、分支管理的操作
1、查看分支命令
git branch
执行结果:
执行结果表示现在只有一个master
的主分支
2、创建分支
git branch 分支名
执行结果:
3、切换分支
git checkout 分支名
执行结果:
4、创建并切换分支
上面的创建和切换分支,分别进行了两个步骤,可以将这两个步骤合并了一个步骤执行
git branch -b 分支名
动画演示上面代码的执行过程:
5、merge进行分支合并
(1)、在dev分支提交新的修改
(2)、观察不同分支的不同代码
(3)、切换master
主分支合并dev
分支
分支快速合并
git merge 分支名
效果动画:
稍微需要留意的是,现在的主分支master
和dev
分支的合并,属于快速合并,简单来说,就是直接将master
的指针移动到了dev
分支指向的内容上。
快速合并动画演示:
分支no-ff合并
命令格式:
git merge --no-ff [-m '注释']
同样的流程,我们在bugfix分支再进行一次操作,看一下区别:
首先,bugfix分支与master分支同步
在bugfix分支上提交修改
上面代码的动画执行步骤,应该是下面这个样子:
使用 --no-ff
参数进行merge
合并
观察动画演示和之前快速合并的区别:
从动画,以及最后合并之后显示的内容可以看出,快速合并其实只是将master的指针直接移动到了分支所新创建的版本上,而加上--no-ff
参数之后,master分支会自己再创建一个新的版本
6、rebase进行分支合并
除了可以使用merge
进行分支合并之外,还可以使用rebase
进行分支合并,与merge
合并最大的不同是,rebase
会将合入分支上超前的节点在待合入分支上重新提交一遍,从而形成一条线性提交的线。用代码进行测试
(1)、切换到dev分支,合并master分支内容,并进行两次提交
(2)、使用rebase进行合并
命令格式:
git rebase 分支名
从这里可能不能太看出区别,可以使用下面的命令,进行观察
git log --graph --pretty=oneline --abbrev-commit
这段代码的意思是使用简单的图像化方式显示提交日志
从 *
号显示的分叉可以看出,之前使用merge
的合并,其实都保留的有分支提交的分叉记录,而使用rebase
合并,并没有保存之前的分支的分叉提交,相当于,master
主分支把最后这两个在dev
分支上的提交又再次进行了提交,这样让这个版本记录看起来更加整洁。
下面是动画演示上面代码的过程:
7、删除分支
使用命令:
git branch -d 分支名
8、分支远程推送
git push origin 分支名
其实和推送主分支没啥区别,到github网站上看一下
分支冲突
分支冲突,和之前的版本冲突其实是一个道理,只不过之前是由于从远程pull
下来的代码和本地版本不一致导致的冲突。而分支冲突,是由于两个分支之间修改了同一文件,而导致的分支之间的版本不一致所出现的冲突。其实归根结底,就是操作同一文件所产生的冲突。
和版本冲突一样,如果出现了冲突,在merge
时,就会出现下面的代码
在符号
<<<<<<< HEAD
=======
中间的代码,是我们自己本地版本的代码
在符号
=======
>>>>>>> origin/master
中间的代码,是远程仓库拉取下来的代码
解决办法也一样,经过商量以后,删除多余的内容,保留需要的内容,再重新提交就可以了。 下面是具体产生冲突的场景:
比如,master分支与dev分支都修改了users.html页面,同时都进行了版本提交,当master分支合并dev分支的时候就会出现冲突
dev分支users.html:
......
<style>
body{
background-color: #FFB6C1;
}
</style>
</head>
<body>
<h2>用户列表</h2>
</body>
......
master分支users.html:
......
<style>
body{
background-color: #008c8c;
font-size: 14px;
}
</style>
</head>
<body>
<h2>用户详情列表</h2>
</body>
......
执行合并
master分支合并之后是下面这个样子
经过讨论,保留了master分支对样式的修改,以及dev分支页面内容的修改
解决冲突之后,文件的状态:
最后再重新提交一下就可以了
Comments