【转】SVN branch和tag相关用法

发布时间 2023-10-09 14:38:20作者: sgggr

svn 分支(branch)和标签(tag)管理

https://blog.csdn.net/caohongxing/article/details/129311157
版本控制的一大功能是可以隔离变化在某个开发线上,这个开发线就是分支(branch)。

分支通常用于开发新功能,而不会影响主干的开发。也就是说分支上的代码的编译错误、bug不会对主干(trunk)产生影响。然后等分支稳定之后,可以再合并到主干上。

版本管理系统的一大功能是标记特定版本,以便在任何时候都可以重建某个版本的环境,这个标记版本的动作就是打标签。

svn不需要特殊命令来打分支或者打标签。它使用的是一种“轻量copy”的方式,这种方式有些像unix的硬链接。它不会完整的拷贝仓库,而是创建一个内部链接来指向一个特定的版本。基于此,创建分支和标签(tag)非常快,几乎不需要额外耗费仓库的空间。
image
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的结构,后期分支操作很容易。
image
2.1 创建新分支/标签
当我们希望开发一个新功能,那么创建一个新分支,在新分支上开发是个不错的主意,

这样,可以避免新功能开发对主干功能的影响。哇塞!这个技能不错奥!一定要有!

在上面开发已经创建了版本4,现在想在001.txt上新增一个加法功能。

在空白处,点击右键菜单 TortoiseSVN ->Branch/Tag..
image
左侧选择branches,并在URL中输入标签名称 (注意,正常开发新功能应当在branch上,如果选择tag,那么后期提交直接提交文件会有警告)
image
输入日志后,点击【ok】
image
下面这个提示显示分支已经创建了,但是需要你switch 才能切换到该分支

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

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

image
image
切换分支后,你的工作区的代码就是该分支的代码了,009.txt就和trunk上不同了

注意,如果你把tag作为开发分支,则提交时,会有如下所示的警告奥,

svn认为tag从branch或者trunk中打标签才合理。
image
点击 commit按钮,既可完成开发
4.3 打标签
创建tag和创建分支(branch)的操作完全相同
image

只不过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
image
image
仓库名称建议采用英文名称( lianxi)
image

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

image
将导入的trunk地址复制到 “URL of Repository”中
image
点击 【ok】 按钮提交
image
3.3检出代码到本地
为了下面的练习效果更明显。

我们新建一个空的文件夹,在空白处点击右键“SVN checkout”将项目checkout导出到本地
image
输入项目的仓库路径,将代码检出
image
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

修改的文件要提交到版本库,只需要选中改文件,点击右键菜单
image
3.4.2 在主干上:修改009.txt的第2行追加2。
提交日志:修改009的第2行追加2
image
3.4.3 创建分支 demo_20230303_dev_add
提交日志:创建分支demo_20230303_dev_add

文件夹的空白处点击右键菜单 TortoiseSVN -> Branch/Tag..
image
点击 To path 文本框后的 【...】,选择branches,并补充分支名称后返回,填写分支日志后点击【ok】

建议分支名称包含日期和功能
image
完成时,系统提示当前并没有切换到新分支
image
3.4.4 在主干上 修改009.txt的第3行追加3。
提交日志:修改009的第3行追加3

3.4.5 切换到分支(switch) demo_20230303_dev_add
在工作区点击右键菜单 TortoiseSVN -> switch
image

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)
image

image

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

image
3.4.8 将分支合并到主干,
提交日志:合并分支demo_20230303_dev_add 到主干

先切换到主干,然后执行合并
image
image
image
image
image
image
image
image
image
image
分支的日志
image
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中打标签才合理。
image

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