在 SVN(Subversion)版本控制系统中,trunk
、branch
和 tag
是三个核心目录,用于组织和管理代码的不同版本。它们通过 目录结构的约定 来实现版本控制策略。以下是详细说明和示例:
1. Trunk(主干)
- 用途:
trunk
是代码的主线开发目录,代表当前最新的稳定开发版本。- 所有新功能和日常开发都应基于
trunk
进行。
- 存放内容:
- 最新开发中的代码(例如正在开发的
v2.0
版本)。
- 最新开发中的代码(例如正在开发的
- 操作示例:
bash
# 检出主干代码到本地
svn checkout http://svn.example.com/project/trunk
2. Branch(分支)
- 用途:
branch
是代码的并行开发目录,用于隔离高风险修改或长期任务,避免影响主线开发。- 常见的分支场景:开发新功能、修复复杂 Bug、适配不同客户需求。
- 存放内容:
- 从主干分离出来的独立副本(例如
feature-login
分支)。
- 从主干分离出来的独立副本(例如
- 操作示例:
bash
# 从 trunk 创建新分支
svn copy http://svn.example.com/project/trunk \
http://svn.example.com/project/branches/feature-login \
-m "Create branch for login feature"
# 切换到分支开发
svn checkout http://svn.example.com/project/branches/feature-login
- 生命周期:
- 分支开发完成后,需合并回
trunk
,随后可删除或保留存档。
- 分支开发完成后,需合并回
3. Tag(标签)
- 用途:
tag
是代码的只读快照,用于标记特定状态(如发布版本、测试版本)。- 不可修改(若需修改,应创建新分支或新标签)。
- 存放内容:
- 发布版本的静态副本(例如
v1.0.0
、release-2023-09
)。
- 发布版本的静态副本(例如
- 操作示例:
bash
# 从 trunk 创建标签(发布版本)
svn copy http://svn.example.com/project/trunk \
http://svn.example.com/project/tags/v1.0.0 \
-m "Tag version 1.0.0"
- 关键区别:
tag
与branch
技术上是相同的(都是副本),但 语义不同:tag
是存档点,branch
是开发线。
实际场景示例
假设一个团队正在开发一个电商系统:
阶段 1:日常开发
- 所有开发者在
trunk
上协作开发新功能(如购物车模块)。http://svn.example.com/ecommerce/trunk
阶段 2:开发新功能
- 需要开发一个高风险的“用户积分系统”,为避免影响主干:
- 从
trunk
创建分支branches/feature-loyalty
。 - 开发者在此分支上独立开发。
- 开发完成后,将分支合并回
trunk
。
- 从
阶段 3:发布版本
- 当
trunk
的代码达到稳定状态时,创建标签tags/v1.0.0
,用于发布。http://svn.example.com/ecommerce/tags/v1.0.0
阶段 4:修复生产 Bug
- 发现
v1.0.0
存在支付漏洞:- 从标签
tags/v1.0.0
创建分支branches/hotfix-payment
。 - 修复 Bug 后,创建新标签
tags/v1.0.1
。 - 将修复内容合并回
trunk
。
- 从标签
总结
目录 | 用途 | 是否可修改 | 示例路径 |
---|---|---|---|
trunk |
主线开发 | ✔️ | http://svn.example.com/project/trunk |
branch |
并行开发(功能/Bug/实验) | ✔️ | http://svn.example.com/project/branches/feature-login |
tag |
版本存档(发布/里程碑) | ❌ | http://svn.example.com/project/tags/v1.0.0 |
通过这种结构,团队可以高效管理代码的并行开发、版本发布和历史回溯。