【摘抄自网络】:
在源代码的管理过程中,我们经常会听到拉分支(branch)与打标签(tag),二者的区别是什么呢?
- branch用于并行开发,tag用于版本管理。
- branch指向一个具体的开发流程,tag指向一个特定的commit提交。
一般在项目的开发过程中都会有CI(Continuous integration,持续集成),即自动化构建、测试、发布。于是常约定以下常驻branch:
develop分支:用于持续开发的分支,每个开发小组在这个分支上进行小步的持续迭代,正常的code review和开发级的CI也在这个分支上进行。当开发完一个迭代(sprint),开发小组有信心转测时,就将代码合入release分支。
release分支:用于发布的过程分支,包括开发转测、测试和bugfix以及发布上线的过程,当发布成功时要将代码合到master分支上,并在master分支打上一个tag。
master分支:有质量保证的、可安全运行的分支。禁止直接提交代码,只用于代码的合并,在这个分支上的代码永远是可用的、稳定的。当拉一个分支进行开发时,应该基于master分支。
hotfix分支:当线上出现bug并需要修正时,需要在上次上线的tag处临时拉一个hotfix分支进行问题修复,修复后需要将其合入同步到release和master分支并在master打上一个tag。
另外一篇文章:
在SVN中Branch/tag在一个功能选项中,在使用中也往往产生混淆。
在实现上,branch和tag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般的目录没有区别。至于何时用tag,何时用branch,完全由人主观的根据规范和需要来选择,而不是强制的(比如cvs)。
一般情况下,tag,是用来做一个milestone的,不管是不是release,都是一个可用的版本。这里,应该是只读的。更多的是一个显示用的,给人一个可读(readable)的标记。
branch,是用来做并行开发的,这里的并行是指和trunk进行比较。
比如,3.0开发完成,这个时候要做一个tag,tag_release_3_0,然后基于这个tag做release,比如安装程序等。trunk进入 3.1的开发,但是3.0发现了bug,那么就需要基于tag_release_3_0做一个branch,branch_bugfix_3_0,基于这 个branch进行bugfix,等到bugfix结束,做一个tag,tag_release_3_0_1,然后,根据需要决定 branch_bugfix_3_0是否并入trunk。
对于svn还要注意的一点,就是它是全局版本号,其实这个就是一个tag的标记,所以我们经常可以看到,什么什么release,基于xxx项目的 2xxxx版本。就是这个意思了。但是,它还明确的给出一个tag的概念,就是因为这个更加的可读,毕竟记住tag_release_1_0要比记住一个 很大的版本号容易的多。
补充:
svn里面的创建tag/branch操作都是通过copy命令来实现的:在svn里面tag和branch没有啥区别,只是我们赋予了它们不同的含义以便于形成分支开发的概念。
网友评论