服务公告

服务公告 > 综合新闻 > SVN:分支管理

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 [/] * = r

Q4:合并时出现大量二进制文件冲突,手动解决太麻烦怎么办?

吐槽:二进制文件(图片、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),实现分支自动构建和合并门禁