关于Git分支管理和版本管理的5个扫盲问答(deepseek版本)---问答③
问③:
版本号的管理和这个分支之间的关系,该怎么处理呢?
注意:这是续接上个问答的,上个文档是:关于Git分支管理和版本管理的5个扫盲问答(deepseek版本)—问答②
答:
版本号的管理和 Git Flow 分支模型需要紧密配合,核心原则是:版本号与 master 上的 tag 一一对应,而其他分支上的版本号则反映“当前代码的未来归属”。
最常见且推荐的搭配是 语义化版本(SemVer):major.minor.patch(如 2.3.1)。下面我会说明如何在不同分支上管理与这个版本号相关的文件(比如 package.json、version.txt、VERSION 等)。
一、版本号文件存在哪?
通常将版本号以明文形式存放在仓库根目录的一个文件中,并提交到 Git。例如:
VERSION文件,内容仅2.3.1- 或
package.json中的"version"字段 - 或
setup.py中的version=
二、各分支的版本号策略
| 分支 | 版本号示例 | 说明 |
|---|---|---|
master |
2.3.1 |
永远等于最新发布的正式版本。每个合并进 master 的提交都对应一个 tag(如 v2.3.1)。 |
develop |
2.4.0-dev 或 2.4.0-SNAPSHOT |
比当前 master 的下一个次版本号(minor)或主版本号(major)高,并加上 -dev/-alpha/-SNAPSHOT 后缀,表示“开发中”。 |
release/* |
2.4.0(正式版号) |
从 develop 切出时,立即去掉后缀改为正式版本号。在这个分支上可能还会进行最后的小修复,但版本号保持不变(除非修复导致需要增加 patch 号)。 |
hotfix/* |
2.3.2(递增 patch) |
从 master 切出时,将当前正式版本的 patch 号 +1。例如 master 是 2.3.1,则 hotfix 分支版本改为 2.3.2。 |
feature/* |
继承 develop 的版本号 |
一般不单独修改版本号,因为功能分支是临时的,最终要合并回 develop。 |
三、关键操作流程
场景1:准备一个常规发布(从 develop 到 master)
-
当前状态:
master→v2.3.1(tag)develop→ 版本号为2.4.0-dev
-
创建 release 分支:
git checkout -b release/2.4.0 develop在
release/2.4.0上修改版本号文件:2.4.0-dev→2.4.0
提交这个改动。
-
测试与修复:在
release分支上只做 bug 修复,不再增加新功能。任何修复都要 cherry-pick 或合并回develop(避免丢失)。 -
发布完成:
git checkout master git merge --no-ff release/2.4.0 git tag v2.4.0 git push --tags -
将 release 合并回 develop:
git checkout develop git merge --no-ff release/2.4.0此时
develop上的版本号还是2.4.0(因为合并时带入了 release 的版本号)。需要立即修改:- 改为下一个开发版本,例如
2.5.0-dev(假设下一个是 minor 升级)。 - 提交并推送。
- 改为下一个开发版本,例如
-
删除 release 分支。
场景2:紧急热修复(hotfix)
-
当前状态:
master=v2.3.1,线上有严重 bug。
-
创建 hotfix 分支:
git checkout -b hotfix/2.3.2 master在分支上修改版本号文件:
2.3.1→2.3.2
提交这个改动。
-
修复 bug 并测试。
-
合并到 master:
git checkout master git merge --no-ff hotfix/2.3.2 git tag v2.3.2 -
合并回 develop:
git checkout develop git merge --no-ff hotfix/2.3.2注意版本号冲突:
develop上当前可能是2.4.0-dev,而hotfix带来的是2.3.2。解决方案:- 接受
develop的2.4.0-dev(保留未来版本号),但代码修改必须合并进来。 - 手动解决冲突:保留
develop的版本号内容,丢弃 hotfix 的2.3.2。 - 提交合并结果。
- 接受
-
如果此时存在一个正在进行的 release 分支(比如
release/2.4.0),也要将 hotfix 合并到该 release 分支,以避免下个版本丢失修复:git checkout release/2.4.0 git merge hotfix/2.3.2同样注意版本号冲突:保留 release 上的
2.4.0,只合并代码。 -
删除 hotfix 分支。
四、自动化建议
纯手动管理版本号容易出错,建议使用工具自动完成“修改版本号 + 提交 + 打 tag”:
- Node.js 项目:
standard-version或npm version - Java (Maven):
maven-release-plugin - Python:
bumpversion或bump-my-version - 通用:
git cliff+ 自定义脚本
例如执行 npm version patch 会自动:
- 修改
package.json里的版本号(从 1.2.1 到 1.2.2) - 生成一个 commit:
v1.2.2 - 打一个 tag:
v1.2.2
这正好对应 hotfix 或 release 分支上的最后一步。
五、总结表
| 操作 | 哪个分支做 | 版本号变化 | 是否打 tag |
|---|---|---|---|
| 开始新功能开发 | develop |
维持 X.Y.Z-dev |
否 |
| 创建 release | release/* |
去掉 -dev → X.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 对应一个不可变的版本号,所有其他分支的版本号都是为了标识“这个分支将来会变成哪个版本”。按照上述流程,可以避免混乱和冲突。
更多推荐

所有评论(0)