源码管理:Git分支策略、仓库结构与版本号规范

说到源码管理,我见过太多团队在这上面栽跟头了。分支策略选错了,合并冲突能让你怀疑人生。仓库结构设计不好,找文件比找钥匙还难。版本号不规范,发布时连自己都搞不清哪个包是最新的。

今天咱们就把这三件事掰扯清楚。说白了,源码管理就是给代码立规矩。规矩立好了,后面CI/CD流水线才能跑得顺。

一、Git分支策略:选对路子,少走弯路

分支策略这事儿,没有银弹。我这些年用过GitFlow,也用过Trunk-Based,各有各的适用场景。你想想看,一个几十人的团队和一个几百人的团队,玩法能一样吗?

1. GitFlow:传统项目的稳妥之选

GitFlow是我最早接触的分支模型。它把分支分成了几类:

  • master:永远保持可发布状态
  • develop:日常开发的主线
  • feature/*:新功能开发分支
  • release/*:发布准备分支
  • hotfix/*:紧急修复分支

我在项目中遇到过一个问题:团队用了GitFlow,但每次合并release分支到master时,冲突多得让人崩溃。后来我加了一条规矩——release分支上只允许修bug,不允许加新功能。嗯,这才消停了。

GitFlow的核心流程:

# 创建feature分支
git checkout -b feature/login-page develop

# 开发完成后合并回develop
git checkout develop
git merge --no-ff feature/login-page

# 准备发布
git checkout -b release/1.2.0 develop
# 在release分支上修bug
git commit -m "fix: 修复登录超时问题"

# 发布完成,合并到master和develop
git checkout master
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"

git checkout develop
git merge --no-ff release/1.2.0

我的建议:GitFlow适合有固定发布周期的项目,比如一个月发一次版。如果你们每天发版,那GitFlow就太重了。

2. Trunk-Based:持续集成的利器

Trunk-Based,说白了就是所有人在一条主干上开发。分支的生命周期很短,通常不超过一天。

我曾经在一个SaaS团队推行Trunk-Based,刚开始大家都不适应。有人问:「万一代码没测好就合并了怎么办?」我的回答是:「那就靠自动化测试兜底啊。」

Trunk-Based的关键规则:

  • 所有开发都在主干(trunk/main)上进行
  • 分支只用于短期开发(几小时到一天)
  • 频繁合并,每天至少合并一次
  • 合并前必须通过自动化测试

注意:Trunk-Based对CI/CD的要求很高。如果你们的自动化测试跑一次要半小时,那还是别用Trunk-Based了。我曾经见过一个团队,测试跑一次要两小时,结果大家都不敢合并代码,主干反而成了最不稳定的分支。

二、代码仓库结构设计:别让文件乱飞

仓库结构这事儿,看着简单,但设计不好真的很要命。我接手过一个SDK项目,源码、文档、测试、示例代码全混在一起,找个配置文件得翻半天。

下面是我个人比较推荐的结构:

sdk-project/
├── src/                    # 源码目录
│   ├── core/              # 核心逻辑
│   ├── utils/             # 工具函数
│   └── index.ts           # 入口文件
├── tests/                 # 测试代码
│   ├── unit/              # 单元测试
│   └── integration/       # 集成测试
├── docs/                  # 文档
│   ├── api/               # API文档
│   └── guides/            # 使用指南
├── examples/              # 示例代码
│   ├── basic/             # 基础示例
│   └── advanced/          # 高级示例
├── scripts/               # 构建脚本
│   ├── build.sh           # 构建脚本
│   └── release.sh         # 发布脚本
├── .github/               # GitHub配置
│   └── workflows/         # CI/CD流水线
├── package.json           # 依赖管理
├── tsconfig.json          # TypeScript配置
└── README.md              # 项目说明

这里有几个要点:

  • 源码和测试分开:别把测试文件混在src里,不然打包时还得费劲排除
  • 文档单独放:我习惯把文档放在docs目录,这样方便生成文档站点
  • 示例代码独立:示例代码不是SDK的一部分,别放在src里
  • 脚本统一管理:所有构建、发布脚本放scripts目录,别散落在各处

一个小技巧:在仓库根目录放一个CONTRIBUTING.md,告诉贡献者代码该怎么组织。我见过太多人把新文件随便往根目录一扔,结果根目录越来越乱。

三、源码标签与版本号规范:给代码打上标记

版本号这事儿,看着简单,但坑不少。我见过有人用v1、v2这种版本号,结果发到v10的时候,排序都排不对了。

1. 语义化版本号(SemVer)

语义化版本号是目前最通用的规范。格式是:主版本号.次版本号.修订号

版本号 含义 示例
主版本号 不兼容的API变更 1.0.0 → 2.0.0
次版本号 向下兼容的功能新增 1.0.0 → 1.1.0
修订号 向下兼容的问题修复 1.0.0 → 1.0.1

我建议在版本号后面加上预发布标识:

  • 1.0.0-alpha.1:内部测试版
  • 1.0.0-beta.2:公开测试版
  • 1.0.0-rc.3:候选发布版

我曾经踩过的坑:有一次发布SDK,我忘了更新版本号,结果用户下载的还是旧版本。后来我加了一条规矩——每次发布前必须检查版本号是否已更新,并且要在CHANGELOG里记录变更。

2. Git标签规范

Git标签要和版本号对应起来。我习惯用v前缀:

# 创建标签
git tag -a v1.2.0 -m "Release version 1.2.0"

# 推送标签
git push origin v1.2.0

# 查看所有标签
git tag -l

标签命名规则:

  • 正式版:v1.2.0
  • 预发布版:v1.2.0-beta.1
  • 热修复版:v1.2.1

注意:标签一旦创建,尽量不要删除或修改。如果发错了版本,正确的做法是发一个新版本,而不是回滚标签。我见过有人删标签重打,结果CI/CD流水线全乱了。

四、知识体系总览

下面这张图是我梳理的源码管理知识体系,你可以对照着看看自己团队在哪个环节还有改进空间:

源码管理知识体系 分支策略 GitFlow Trunk-Based Feature Branch 仓库结构 源码目录(src) 测试目录(tests) 文档目录(docs) 示例目录(examples) 版本规范 语义化版本(SemVer) Git标签规范 CHANGELOG管理 三者协同:分支策略决定开发流程 仓库结构保证代码整洁,版本规范确保发布有序

你看,这三个东西其实是环环相扣的。分支策略决定了你怎么开发,仓库结构决定了代码怎么组织,版本规范决定了发布怎么管理。任何一个环节出了问题,整个SDK发布流程都会受影响。

最后说一句:规范是死的,人是活的。别为了用GitFlow而用GitFlow,也别为了赶时髦硬上Trunk-Based。选适合自己团队的,然后严格执行。我见过太多团队,规范定了一堆,执行起来全凭心情,那还不如不定规范。

可可精品资料库