Git多版本并行维护必须有至少两个长期独立演进的发布分支(如release/1.1.x和release/2.0.x),配合main/stable承载最新大版本,hotfix分支需嵌入目标版本号(如hotfix/1.1.5-login-null-pointer)并严格限定合并路径,禁止跨版本混入功能代码。

Git 多版本并行维护需要哪些核心分支类型
必须有至少两个长期存在的、各自独立演进的发布分支,否则谈不上“并行维护”。main 或 master 单一分支只适合一路向前的项目,无法支撑 1.1.x 和 2.0.x 同时修 bug 的场景。
典型结构是:
-
main(或stable):仅承载最新大版本(如 2.0.x),不接收旧版本补丁 -
release/1.1.x:专用于维护 1.1 系列,只合入hotfix/1.1.x-xxx类修复 -
release/2.0.x:同理,只接受针对 2.0 的热修复和小版本更新 -
develop(可选):若需为下一个大版本(如 3.0)提前集成,可设独立开发主线,但不能与旧版 release 分支混用
关键点:每个 release/* 分支必须有明确的语义范围(如 1.1.x 表示兼容 1.1.0 的所有补丁),且禁止向其中合入新功能或跨版本变更。
hotfix 分支怎么命名和合并才不会串版本
错误做法是统一用 hotfix/xxx,这会导致修复不知道该打到哪个 release 分支上。正确方式是把目标版本嵌入分支名中。
推荐命名格式:hotfix/1.1.5-login-null-pointer,其中 1.1.5 是待发布的补丁版本号,不是随便写的数字。
合并路径必须严格限定:
- 从
release/1.1.x拉出 → 修复 → 推送 → 合并回release/1.1.x和main(如果 1.1.x 是当前 LTS,且main已升级到 2.0,则不合并回main) - 绝对禁止直接合并到
develop或其他release/2.0.x - 打 tag 时用
v1.1.5,而不是v1.1.5-hotfix—— 补丁版本号本身就是语义的一部分
CI 脚本里应校验:push 到 hotfix/* 时,分支名中的版本前缀是否存在于已定义的 release/* 列表中,否则拒绝推送。
使用 `gh` CLI 与 GitHub 交互。通过`gh issue`、`gh pr`、`gh run` 和 `gh api` 管理 issue、PR、CI 运行以及高级查询。
如何避免 develop 分支污染旧版本线
很多团队误把 develop 当作“所有功能的收口”,结果导致 1.1.x 的 hotfix 合并后意外带入 2.0 的实验性代码。根本原因是 develop 和多个 release 分支之间没有单向隔离。
可行方案只有两种:
- 弃用
develop,改用「每个 release 分支自建集成点」:比如release/1.1.x上允许合入feature/1.1-backport-xxx(需 cherry-pick 自main的兼容修改),但禁止任何来自feature/2.0-xxx的提交 - 保留
develop,但强制规定它只服务下一个大版本(如 3.0),且所有向release/*的 backport 必须手工 cherry-pick,并通过git log --oneline <commit> --not release/1.1.x</commit>验证无依赖泄露
实际项目中,Apache Flink 就采用前者:没有全局 develop,release-1.16 和 release-1.17 各自管理自己的 backport 流程,互不干扰。
git worktree 对多版本维护的实际帮助有限
有人想用 git worktree add ../v1-release release/1.1.x 和 git worktree add ../v2-release release/2.0.x 来并行调试,这确实能避免频繁 git checkout,但掩盖了真正的协同问题。
worktree 解决的是“本地操作效率”,不是“分支策略一致性”。你依然要面对:
- 同一份 CI 配置文件在
release/1.1.x和release/2.0.x中可能需要不同参数,但它们共享同一个.github/workflows/ci.yml - cherry-pick 错误提交后,
git reflog在不同 worktree 里看到的 HEAD 移动路径不一致,排查困难 - 没人能保证你在
../v1-release里改完代码后,不会手抖 push 到release/2.0.x
真正需要的是分支保护规则(如 GitHub Branch Protection Rules)、自动化 backport 检查(如 backport-action),而不是靠多开目录来“假装”隔离。

















