问③:

版本号的管理和这个分支之间的关系,该怎么处理呢?

注意:这是续接上个问答的,上个文档是:关于Git分支管理和版本管理的5个扫盲问答(deepseek版本)—问答②

答:

版本号的管理和 Git Flow 分支模型需要紧密配合,核心原则是:版本号与 master 上的 tag 一一对应,而其他分支上的版本号则反映“当前代码的未来归属”。

最常见且推荐的搭配是 语义化版本(SemVer)major.minor.patch(如 2.3.1)。下面我会说明如何在不同分支上管理与这个版本号相关的文件(比如 package.jsonversion.txtVERSION 等)。

一、版本号文件存在哪?

通常将版本号以明文形式存放在仓库根目录的一个文件中,并提交到 Git。例如:

  • VERSION 文件,内容仅 2.3.1
  • package.json 中的 "version" 字段
  • setup.py 中的 version=

二、各分支的版本号策略

分支 版本号示例 说明
master 2.3.1 永远等于最新发布的正式版本。每个合并进 master 的提交都对应一个 tag(如 v2.3.1)。
develop 2.4.0-dev2.4.0-SNAPSHOT 比当前 master 的下一个次版本号(minor)或主版本号(major)高,并加上 -dev/-alpha/-SNAPSHOT 后缀,表示“开发中”。
release/* 2.4.0(正式版号) develop 切出时,立即去掉后缀改为正式版本号。在这个分支上可能还会进行最后的小修复,但版本号保持不变(除非修复导致需要增加 patch 号)。
hotfix/* 2.3.2(递增 patch) master 切出时,将当前正式版本的 patch 号 +1。例如 master2.3.1,则 hotfix 分支版本改为 2.3.2
feature/* 继承 develop 的版本号 一般不单独修改版本号,因为功能分支是临时的,最终要合并回 develop

三、关键操作流程

场景1:准备一个常规发布(从 develop 到 master)

  1. 当前状态

    • masterv2.3.1(tag)
    • develop → 版本号为 2.4.0-dev
  2. 创建 release 分支

    git checkout -b release/2.4.0 develop
    

    release/2.4.0 上修改版本号文件:

    • 2.4.0-dev2.4.0
      提交这个改动。
  3. 测试与修复:在 release 分支上只做 bug 修复,不再增加新功能。任何修复都要 cherry-pick 或合并回 develop(避免丢失)。

  4. 发布完成

    git checkout master
    git merge --no-ff release/2.4.0
    git tag v2.4.0
    git push --tags
    
  5. 将 release 合并回 develop

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

    此时 develop 上的版本号还是 2.4.0(因为合并时带入了 release 的版本号)。需要立即修改

    • 改为下一个开发版本,例如 2.5.0-dev(假设下一个是 minor 升级)。
    • 提交并推送。
  6. 删除 release 分支

场景2:紧急热修复(hotfix)

  1. 当前状态

    • master = v2.3.1,线上有严重 bug。
  2. 创建 hotfix 分支

    git checkout -b hotfix/2.3.2 master
    

    在分支上修改版本号文件:

    • 2.3.12.3.2
      提交这个改动。
  3. 修复 bug 并测试

  4. 合并到 master

    git checkout master
    git merge --no-ff hotfix/2.3.2
    git tag v2.3.2
    
  5. 合并回 develop

    git checkout develop
    git merge --no-ff hotfix/2.3.2
    

    注意版本号冲突develop 上当前可能是 2.4.0-dev,而 hotfix 带来的是 2.3.2。解决方案:

    • 接受 develop2.4.0-dev(保留未来版本号),但代码修改必须合并进来。
    • 手动解决冲突:保留 develop 的版本号内容,丢弃 hotfix 的 2.3.2
    • 提交合并结果。
  6. 如果此时存在一个正在进行的 release 分支(比如 release/2.4.0),也要将 hotfix 合并到该 release 分支,以避免下个版本丢失修复:

    git checkout release/2.4.0
    git merge hotfix/2.3.2
    

    同样注意版本号冲突:保留 release 上的 2.4.0,只合并代码。

  7. 删除 hotfix 分支

四、自动化建议

纯手动管理版本号容易出错,建议使用工具自动完成“修改版本号 + 提交 + 打 tag”:

  • Node.js 项目standard-versionnpm version
  • Java (Maven)maven-release-plugin
  • Pythonbumpversionbump-my-version
  • 通用git cliff + 自定义脚本

例如执行 npm version patch 会自动:

  • 修改 package.json 里的版本号(从 1.2.1 到 1.2.2)
  • 生成一个 commit:v1.2.2
  • 打一个 tag:v1.2.2

这正好对应 hotfixrelease 分支上的最后一步。

五、总结表

操作 哪个分支做 版本号变化 是否打 tag
开始新功能开发 develop 维持 X.Y.Z-dev
创建 release release/* 去掉 -devX.Y.Z
发布 release master 不变 (vX.Y.Z)
创建 hotfix hotfix/* patch+1
发布 hotfix master 不变 (vX.Y.Z+1)
合并 release/hotfix 回 develop develop 改为下一个 X.(Y+1).0-dev

版本号管理的核心就是:master 上的每个 tag 对应一个不可变的版本号,所有其他分支的版本号都是为了标识“这个分支将来会变成哪个版本”。按照上述流程,可以避免混乱和冲突。

更多推荐