服务公告
SVN:分支管理
发布时间:2026-04-21 11:01
一、前言
搞过的人都知道,最烦的是SVN分支管理混乱——开发说分支找不到,测试说代码对不上,合并冲突满天飞。本文解决的就是:如何规范创建、切换、合并、删除分支,让团队不再因为分支问题扯皮。
二、操作步骤
第1步:确认SVN环境
先看看你机器上SVN版本和仓库结构,别上来就一顿操作。
[root@prod-server ~]# svn --version
svn, version 1.14.2 (r1692801)
compiled Feb 3 2022, 20:34:04 on x86_64-redhat-linux-gnu
[root@prod-server ~]# svn info svn://192.168.1.100/repos/project
Path: project
URL: svn://192.168.1.100/repos/project
Repository Root: svn://192.168.1.100/repos
Repository UUID: a5b3c2d1-e4f5-6789-0123-456789abcdef
Revision: 156
Node Kind: directory
Last Changed Author: zhangsan
Last Changed Rev: 156
Last Changed Date: 2025-07-15 10:30:00 +0800第2步:查看当前分支结构
很多新手不知道仓库里已经有哪些分支,上来就自己新建,结果命名冲突。
[root@prod-server ~]# svn ls svn://192.168.1.100/repos/project/branches
release-1.0/
release-1.1/
release-2.0-beta/
hotfix-vulnerability-fix/
[root@prod-server ~]# svn ls svn://192.168.1.100/repos/project/tags
v1.0.0/
v1.0.1/
v1.1.0/
v2.0.0-beta/
[root@prod-server ~]# svn ls svn://192.168.1.100/repos/project/trunk
branches/
tags/
trunk/第3步:创建新的功能分支
从主干拉分支开发新功能,记得带上任务编号方便追溯。
[root@prod-server ~]# svn copy svn://192.168.1.100/repos/project/trunk
> svn://192.168.1.100/repos/project/branches/feature-ORDER-1234
> -m "创建订单模块重构分支,负责人:李四"
Committing transaction...
Committed revision 157.
[root@prod-server ~]# svn ls svn://192.168.1.100/repos/project/branches/ | grep ORDER
feature-ORDER-1234/第4步:切换到分支进行开发
本地工作副本切换到分支,注意先确认本地没有未提交的改动。
[root@dev-server ~]# svn status
? src/main.java
[root@dev-server ~]# svn switch svn://192.168.1.100/repos/project/branches/feature-ORDER-1234
Updating '.':
U src/com/order/OrderService.java
Updated to revision 157.
[root@dev-server ~]# svn info | grep "URL:"
URL: svn://192.168.1.100/repos/project/branches/feature-ORDER-1234第5步:模拟开发并提交代码
开发过程中养成小步提交的习惯,别憋一周搞个几千行合并。
[root@dev-server ~]# svn diff src/com/order/OrderService.java
Index: src/com/order/OrderService.java
===================================================================
--- src/com/order/OrderService.java (revision 157)
+++ src/com/order/OrderService.java (working copy)
@@ -15,7 +15,7 @@
public Order createOrder(OrderDTO dto) {
// 新增参数校验
- if (dto == null) {
+ if (dto == null || dto.getItems().isEmpty()) {
throw new IllegalArgumentException("订单数据不合法");
}
[root@dev-server ~]# svn commit -m "ORDER-1234: 添加订单商品列表空校验"
Sending src/com/order/OrderService.java
Transmitting file data .done
Committing transaction...
Committed revision 158.第6步:将主干合并到分支(同步主干更新)
主干在开发期间可能有bugfix或者公共模块更新,分支需要定期同步。
[root@dev-server ~]# svn switch svn://192.168.1.100/repos/project/branches/feature-ORDER-1234
# 已经在此分支,直接执行合并
[root@dev-server ~]# svn merge ^/trunk
--- Merging r150 through r158 into '.':
U src/com/common/BaseController.java
U pom.xml
--- Recording mergeinfo for merge of r150 through r158 into '.':
U .
[root@dev-server ~]# svn commit -m "合并r150-r158主干更新到feature-ORDER-1234分支"
Sending src/com/common/BaseController.java
Sending pom.xml
Sending .
Transmitting file data ..
Committed revision 159.第7步:合并分支回主干(测试完成后)
⚠️ 警告:此操作不可逆,合并前确保代码已通过测试!
[root@prod-server ~]# svn switch ^/trunk
Updating '.':
At revision 159.
[root@prod-server ~]# svn merge --reintegrate ^/branches/feature-ORDER-1234
--- Merging differences between repository URLs into '.',
U src/com/order/OrderService.java
U src/com/order/OrderController.java
--- Recording mergeinfo for merge of ^/branches/feature-ORDER-1234 into '.':
U .
[root@prod-server ~]# svn status
M src/com/order/OrderService.java
M src/com/order/OrderController.java
[root@prod-server ~]# svn commit -m "ORDER-1234: 合并订单重构功能到主干"
Sending src/com/order/OrderService.java
Sending src/com/order/OrderController.java
Transmitting file data ..
Committed revision 160.第8步:删除已合并的分支
分支合并完别忘了删掉,仓库里堆一堆僵尸分支后面没法看。
[root@prod-server ~]# svn delete svn://192.168.1.100/repos/project/branches/feature-ORDER-1234
> -m "删除已合并的ORDER-1234功能分支"
Committing transaction...
Committed revision 161.
[root@prod-server ~]# svn ls svn://192.168.1.100/repos/project/branches/ | grep ORDER
# 无输出,分支已删除第9步:创建发布分支(从主干打标签)
生产发布要用单独的分支,禁止从主干直接拉代码部署。
[root@prod-server ~]# svn copy svn://192.168.1.100/repos/project/trunk
> svn://192.168.1.100/repos/project/branches/release-2.1.0
> -m "创建v2.1.0发布分支"
Committing transaction...
Committed revision 162.
[root@prod-server ~]# svn copy svn://192.168.1.100/repos/project/branches/release-2.1.0
> svn://192.168.1.100/repos/project/tags/v2.1.0
> -m "打tag:v2.1.0"
Committing transaction...
Committed revision 163.三、常见问题FAQ
Q1:合并时报Tree conflict怎么办?
吐槽:这破问题十有八九是有人先提交了目录结构的修改,你这边还在用老结构合并。解决方法:先update拿到最新版本,然后手动处理冲突目录。
[root@dev-server ~]# svn update
Updating '.':
C src/com/order
Updated to revision 165.
Summary of conflicts:
Tree conflicts: 1
[root@dev-server ~]# svn resolve --accept working src/com/order
Resolved conflicted state of 'src/com/order'
[root@dev-server ~]# svn commit -m "解决目录树冲突"
# 冲突解决后再继续合并Q2:分支合并后想回滚,怎么操作?
吐槽:合并完发现有问题想撤回?别用svn revert,那只能撤销本地未提交的改动。线上回滚只能反向合并。
[root@prod-server ~]# svn merge -r 160:159 .
--- Reverse-merging r160 into '.':
U src/com/order/OrderService.java
U src/com/order/OrderController.java
[root@prod-server ~]# svn commit -m "回滚:撤销ORDER-1234合并"
Sending src/com/order/OrderService.java
Sending src/com/order/OrderController.java
Transmitting file data ..
Committed revision 166.Q3:能不能给分支加权限,不同人只能操作自己的分支?
吐槽:可以,但别指望SVN自带的多细粒度权限管理。想精确控制,老实用Apache/Nginx配authz,或者直接上Git。SVN的authz配置示例:
# CentOS/RHEL: /etc/svn-passwd + /etc/svn-authz
# Ubuntu: /var/lib/svnrepos/project/conf/passwd + /var/lib/svnrepos/project/conf/authz
[groups]
dev-team = zhangsan,lisi,wangwu
[/branches/feature-*]
@dev-team = rw
* =
[/branches/release-*]
@dev-team = r
ops = rw
[/]
* = rQ4:合并时出现大量二进制文件冲突,手动解决太麻烦怎么办?
吐槽:二进制文件(图片、jar包)就别往SVN里塞了,这不是它的强项。实在要处理,用theirs-full或mine-full强制选择一方。
[root@dev-server ~]# svn resolve --accept theirs-full src/resources/logo.png
Resolved conflicted state of 'src/resources/logo.png'
[root@dev-server ~]# svn resolve --accept mine-full src/lib/commons-lang-2.6.jar
Resolved conflicted state of 'src/lib/commons-lang-2.6.jar'四、总结
核心要点
- 命名规范:分支命名带任务编号,标签用语义化版本号,团队统一规范比工具本身更重要
- 定期同步:功能分支开发期间至少每周合并一次主干,别憋到快上线再合,那叫给自己挖坑
- 小步提交:合并冲突少的时候好处理,别一个分支改三个月攒几千行diff
- 分支生命周期:功能分支合并后删除,发布分支保留,标签永远不动
- 权限控制:主干和发布分支权限收紧,功能分支可以放宽,避免手滑误操作
延伸阅读
- SVN官方文档:http://svnbook.red-bean.com/ (分支与合并章节必看)
- 如果团队超过20人,建议评估迁移Git,SVN在大规模协作时分支管理效率是硬伤
- 大型项目可考虑SVN + CI/CD集成(Jenkins、GitLab CI),实现分支自动构建和合并门禁
相关推荐
上一篇: 微服务:最佳实践
下一篇: 宝塔面板:宝塔面板基础操作