为什么要使用分支:
- 一个分支通常代表一个单独的客户发布端。
- 一个分支可以封装一个开发阶段
一个分支可以隔离一个特性的开发或者研究特复杂的bug。
紧急修补漏洞步骤:
- 返回到原先已经发布到生产服务器上的分支。
- 为这次紧急修补建立一个新分支,并在其中修复问题。
- 通过测试后,回到生产服务器所在的分支,将修补分支合并进来,然后再推送到生产服务器上。
- 切换到之前实现新需求的分支,继续工作。
分支命名注意事项:
- 可以使用斜杠(/)创建一个分层的命名方案,但是不能以斜杠结尾。
- 分支号不可以用减号结尾(-)。
- 以斜杠分割的组件不能以点(.)开头。如feature/.new这样的分支名师无效的。
- 分支名的任何地方都不可以包含两个连续的点(..)
- 分支名不可以包括任何空格或者其他空白符。
- 不可以使用~、^、: 、?、*、[ 等在Git中具有特殊意义的符号
分支的使用:
每个分支在一个特定的版本中必须有唯一的名字,这个名字始终会指向该分支上最近提交的版本。一个分支的最近提交称为该分支的头部(tip 或者 head)。说白点, 分支其实就是从某个提交对象往回看的历史 。
1.创建分支:
$ git branch prs
这会在当前 commit 对象上新建一个分支指针,现在我们建立了一个新的分支prs。
注意:git branch 这个命令只是把分支名引进到版本库中,并没有改变工作目录去使用新的分支。
那么Git是如何知道你在哪个分支上工作呢?
因为它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统(比如 Subversion 或 CVS)里的 HEAD 概念大不相同!在 Git 中,它是一个指向你正在工作中的本地分支的指针,就相当于版本库是一个地图,地图上有许多的道路(分支),而HEAD 指针就是你的所在之处(所处分支)。运行git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作,新建的分支就如同是一条新开辟的道路一般,只是命了名,还未施工。
2.切换到其他分支
要切换到其他分支,可以执行 git checkout 命令:
$ git checkout prs
这时HEAD 这个指针就把你定位到了prs这个分支上啦。
此时,如果我们commit某个文件,这个文件会归到prs这个分支上,head指针也会随着移动,我们可以将此文件比喻成这条道路上的某个标志物。
当然上面还有更快捷的方式使你创建新分支并且立即切换到该分支上,一次性执行上面的两个代码片段:
$ git checkout -b gto
3.查看分支
$ git branch
$ git show-branch
$ git branch -v
第一个是查看你的所有分支,结果只会显示分支名,其他的都不显示。注意看 某个分支前的有个 * 字符:它表示当前所在的分支。
第二个命令提供比第一个更详细的内容结果,按时间以递序的形式列出对一个或多个分支有贡献的提交。
第三个命令使你可以查看各个分支中的最后一个提交对象的信息
4.合并分支
第一种合并方式:快进
$ git merge prs
这时,合并时出现了“Fast forward”的提示。由于当前 master 分支所在的提交对象是要并入的 prs 分支的直接上游,Git 只需把master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。
此时合并之后,master 分支和 prs 分支都会指向同一位置,就相当于两条道路合并成了一条道路,master和prs都是它的名字。
但是两个名字可能会干扰以后的工作,这时我们就应该舍去一个名字:
$ git branch -d prs
这时我们再用git branch去查询,只会得到master这个分支名。如图中红色框的指向。【一般来说,列表中没有 * 的分支通常都可以用 git branch -d 来删掉。原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。】
这种方式常用于:紧急补救内容
第二种方式:
从这个图片可知不再像第一种方式的一根线路式合并那么简单。因为这次你的开发历史是从更早的地方开始分叉的。由于当前 master 分支所指向的提交对象(文件3)并不是prs 分支的直接祖先,Git 不得不进行一些额外处理。就此例而言,Git 会用两个分支的末端(文件3 和 文件5)以及它们的共同祖先(文件1)进行一次简单的三方合并计算。上图中的红色四角星给出了 Git 用于合并的三个提交对象。随后Git 会为分支合并自动识别出最佳的同源合并点。如图:
5.查看是否已合并
$ git branch --merged
$ git branch --no-merged
第一个代码是用于查看哪些分支已被并入当前分支。
第二个代码则是还未合并进来的分支。【这里的分支不能用git branch -d 删除,会提示错误,因为这样做会丢失数据!】