版本控制的一大功能是可以隔离变化在某个开发线上,这个开发线就是分支(branch)。
分支通常用于开发新功能,而不会影响主干的开发。也就是说分支上的代码的编译错误、bug不会对主干(trunk)产生影响。然后等分支稳定之后,可以再合并到主干上。
版本管理系统的一大功能是标记特定版本,以便在任何时候都可以重建某个版本的环境,这个标记版本的动作就是打标签。
svn不需要特殊命令来打分支或者打标签。它使用的是一种“轻量copy”的方式,这种方式有些像unix的硬链接。它不会完整的拷贝仓男裤,而是创建一个内部链接来指向一个特定的版本。基于此,创建分支和标签(tag)非常快,几乎不需要额外耗费仓库的空间。

1.分支与标签(tag)的区别:
创建方式相同
svn中,分支和标签(tag)之间没有什么明显的差别,分支和标签的创建方式相同。
使用情景不同
分支主要用于开发新功能。
标签(tag)用于保存一个静态的内容。例如一个阶段性成果。
如果用tag来存储一个动态变化的内容,那么系统会进行警告。
建议tag的名称包含版本号
branch包括 日期+功能点
分支和tag的转换
当我们发布了1.0版本,这个1.0版本在tag中存储。
后来发现1.0版本需要修改。那么
我们从1.0的tag创建一个分支。
在分支上修改,直到修改完成。
然后再从该分支创建新的tag
2.分支操作
这里先让大家有个大致的里阿杰,第3部分我们来实操
为了方便的进行分支操作,创建仓库时,建议采用 trunk tag branches的结构,后期分支操作很容易。

2.1 创建新分支/标签
当我们希望开发一个新功能,那么创建一个新分支,在新分支上开发是个不错的主意,
这样,可以避免新功能开发对主干功能的影响。哇塞!这个技能不错奥!一定要有!
在上面开发已经创建了版本4,现在想在001.txt上新增一个加法功能。
在空白处,点击右键菜单 TortoiseSVN ->Branch/Tag..

左侧选择branches,并在URL中输入标签名称 (注意,正常开发新功能应当在branch上,如果选择tag,那么后期提交直接提交文件会有警告)

输入日志后,点击【ok】

下面这个提示显示分支已经创建了,但是需要你switch 才能切换到该分支

此时如果在工作区空白处点击右键 TortoiseSVN -> Revision graph,则可以看到如下,已经可以看到新的分支了

4.2切换分支
现在我们切换到刚才创建的分支 dev_add



切换分支后,你的工作区的代码就是该分支的代码了,009.txt就和trunk上不同了
注意,如果你把tag作为开发分支,则提交时,会有如下所示的警告奥,
svn认为tag从branch或者trunk中打标签才合理。

点击 commit按钮,既可完成开发
4.3 打标签
创建tag和创建分支(branch)的操作完全相同

只不过tag用于保存里程碑成果。比如0.1版本的软件资产。通常不在tag中修改
例如,实际工作中可能存在如下情景:
假设图书管理系统V1.0版本代码已经通过测试,现在我们将该成果打标签,在tag中存储(将阶段成果固化)
后来发现1.0版本有bug。我们从1.0的tag创建一个分支。
在分支上修改,直到修改完成。
然后再从该分支创建新的tag。
3.分支实操
下面让我们来完整的走个流程试一试!
3.1创建一个有 trunk/branch/tag的仓库(svn server端)
点击Repositories上点击右键菜单:Create New Repository


仓库名称建议采用英文名称( lianxi)




3.2.将本地项目导入到远程仓库

将导入的trunk地址复制到 “URL of Repository”中

点击 【ok】 按钮提交

3.3检出代码到本地
为了下面的练习效果更明显。
我们新建一个空的文件夹,在空白处点击右键“SVN checkout”将项目checkout导出到本地

输入项目的仓库路径,将代码检出

3.4.分支创建及提交
总的步骤如下,下面我们来一步一步完成
在主干上:修改009.txt的第1行追加1。 提交日志:修改009的第1行追加1
在主干上:修改009.txt的第2行追加2。 提交日志:修改009的第2行追加2
创建分支 demo_20230303_dev_add 提交日志:创建分支demo_20230303_dev_add
在主干上 修改009.txt的第3行追加3。 提交日志:修改009的第3行追加3
切换到分支(switch) demo_20230303_dev_add
在分支demo_20230303_dev_add 上 修改001.txt 删除4-6行,添加 如下的add函数,提交日志:添加add函数
int add(int x , int y)
{
return x+y;
}
在分支demo_20230303_dev_add 上 修改002.txt 末尾追加----,
提交日志: 修改002.txt 末尾追加----
将分支合并到主干,提交日志:合并分支demo_20230303_dev_add 到主干
此时主干的代码即包括了主干的修改,又包括分支的修改。
3.4.1 在主干上:修改009.txt的第1行追加1。
提交日志:修改009的第1行追加1
修改的文件要提交到版本库,只需要选中改文件,点击右键菜单

3.4.2 在主干上:修改009.txt的第2行追加2。
提交日志:修改009的第2行追加2

3.4.3 创建分支 demo_20230303_dev_add
提交日志:创建分支demo_20230303_dev_add
文件夹的空白处点击右键菜单 TortoiseSVN -> Branch/Tag..

点击 To path 文本框后的 【...】,选择branches,并补充分支名称后返回,填写分支日志后点击【ok】
建议分支名称包含日期和功能

完成时,系统提示当前并没有切换到新分支

3.4.4 在主干上 修改009.txt的第3行追加3。
提交日志:修改009的第3行追加3
3.4.5 切换到分支(switch) demo_20230303_dev_add
在工作区点击右键菜单 TortoiseSVN -> switch

3.4.6 在分支demo_20230303_dev_add 上 修改001.txt 删除4-6行, 添加 add函数,
提交日志:添加add函数
int add(int x , int y)
{
return x+y;
}
提交之后可以查看版本树 (文件夹空白处点击右键菜单 TortoiseSVN ->Revison graph)


3.4.7在分支demo_20230303_dev_add 上 修改002.txt 末尾追加----
提交日志: 修改002.txt 末尾追加----

3.4.8 将分支合并到主干,
提交日志:合并分支demo_20230303_dev_add 到主干
先切换到主干,然后执行合并










分支的日志

3.5 打标签
如果
下面我们模拟以下操作步骤:
假设图书管理系统V1.0版本代码已经通过测试,现在我们将该成果打标签1(将阶段成果固化)
图书管理系统继续开发主干分支继续修改
从标签1创建分支
当我们发布了1.0版本,这个1.0版本在tag中存储。
后来发现1.0版本需要修改。那么
我们从1.0的tag创建一个分支。
在分支上修改,直到修改完成。
然后再从该分支创建新的tag
3.6 注意 tag一般只保存阶段成果,不用来保存变化的内容
如果你把tag作为开发分支,则提交时,会有如下所示的警告奥,
svn认为tag从branch或者trunk中打标签才合理。

点击 commit按钮,既可完成开发