1 完整层次结构图
upstream(官方仓库,只读镜像,不写任何代码)
├── 6.X ────────────────┐
├── 5.X ──┐ │ ① 官方同步:只准进 dev
└── 7.X / tags(官方将来更新自动出现在这)
│ ▼
origin(你自己的仓库)
│
├── dev ━━ 从 upstream/6.X 立 【长期 · 测试环境 · 保护】
│ ▲ ▲
│ │ └── feature/* 合回
│ │ (feature/* 从 dev 立,合并后删除)
│ │
│ │ ③ 发版 PR(测试验证通过后)
│ ▼
├── main ━ 从 dev 立(初始时刻两者相同) 【长期 · 生产环境 · 默认分支 · 保护】
│ ▲
│ └── ④ hotfix/* 合回
│ (hotfix/* 从 main 立,合并后删除)
│ ⑤ hotfix 发版后必须再合回 dev
│
└── 可选老线(需要维护 5.X 客户时才建,结构同上,与上面永不交叉合并)
├── dev-5x ◀━ 从 upstream/5.X 立
└── main-5x ◀━ 从 dev-5x 立2 五条流向(对应图中编号)
① 同步 upstream/6.X ──merge──▶ dev 网页操作:先切到 dev 再点 Sync fork
② 开发 dev ──立──▶ feature/* ──PR──▶ dev
③ 发版 dev ──PR──▶ main ──tag v1.x──▶ 生产部署
④ 救火 main ──立──▶ hotfix/* ──PR──▶ main ──tag──▶ 生产部署
⑤ 回同步 main ──merge──▶ dev (hotfix 后必做)3 速查表
| 分支 | 从哪立 | 合回哪 | 环境 | 生命周期 | 保护 |
|---|---|---|---|---|---|
upstream/6.X | —(官方) | — | — | 远程引用 | 只读 |
upstream/5.X | —(官方) | — | — | 远程引用 | 只读 |
dev | upstream/6.X | main(发版) | 测试 | 长期 | 保护,PR 合并 |
main | dev | dev(hotfix 回同步) | 生产 | 长期 | 保护,PR + 评审 |
feature/* | dev | dev | 开发/联调 | 临时,合并后删 | 不保护 |
hotfix/* | main | main + dev | — | 临时,合并后删 | 不保护 |
dev-5x | upstream/5.X | main-5x(发版) | 测试(老线) | 按需长期 | 同 dev |
main-5x | dev-5x | dev-5x(回同步) | 生产(老线) | 按需长期 | 同 main |
4 一句话口诀
官方在 upstream,自己两条长期线(dev 测、main 产),两种临时枝(feature 从 dev 出、hotfix 从 main 出);官方代码只进 dev,生产代码只从 dev/hotfix 来,hotfix 必回 dev。
这套结构里没有任何一个分支身兼两职,也没有任何一条合并路径是双向混乱的——将来加人、加环境、加老版本线,都只需要按同一模式复制,不会破坏现有秩序。