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—(官方)——远程引用只读
devupstream/6.Xmain(发版)测试长期保护,PR 合并
maindevdev(hotfix 回同步)生产长期保护,PR + 评审
feature/*devdev开发/联调临时,合并后删不保护
hotfix/*mainmain + dev—临时,合并后删不保护
dev-5xupstream/5.Xmain-5x(发版)测试(老线)按需长期同 dev
main-5xdev-5xdev-5x(回同步)生产(老线)按需长期同 main

4 一句话口诀

官方在 upstream,自己两条长期线(dev 测、main 产),两种临时枝(feature 从 dev 出、hotfix 从 main 出);官方代码只进 dev,生产代码只从 dev/hotfix 来,hotfix 必回 dev。

这套结构里没有任何一个分支身兼两职,也没有任何一条合并路径是双向混乱的——将来加人、加环境、加老版本线,都只需要按同一模式复制,不会破坏现有秩序。