先记住:永远从目标合入分支拉新分支
合进谁,就从谁的最新提交开。再去看事故演示,比先堆命令更不容易走偏。
分支规范 · feature 日常开发流 · merge 与 rebase 的本质区别 · 冲突解决实战——配一台「命令 ↔ 图形」同屏对照的 Git Graph 模拟器,把每一条命令在提交图上的效果亲眼看一遍。
合进谁,就从谁的最新提交开。再去看事故演示,比先堆命令更不容易走偏。
一个三人小团队,没有任何分支规范,所有人直接往 main 上提交。点击「播放事故」,看看一个再普通不过的周三是怎么失控的:
科幻片里的平行宇宙设定是:从某个时间点分裂出一条独立时间线,里面随便折腾,不影响主世界。Git 的分支就是这个设定的工程实现——你从 dev 的某个提交「分裂」出 feature 分支,在里面写半成品、做实验、反悔重来,主世界毫无感知;直到你主动把成果合并回去。
而且它比科幻片便宜:Git 的分支不是代码的副本,只是一个 41 字节的小文件,里面记着「这个分支目前指向哪个提交」。开 100 个分支,仓库也不会大 1KB。
原则:永远从目标合入分支拉新分支 · main / dev / feature / release / hotfix · 保护分支
开分支时,问的不是「我现在站在哪」,而是「这条分支最后要合进哪」。新分支必须从那个目标分支的最新提交拉出——feature 合进 dev,就从最新的 dev 拉;hotfix 合进 main,就从最新的 main 拉。从别人的 feature、过期的本地分支、或「我手头这条」切出去,等于把别人的半成品和陈旧历史一并带进你的平行宇宙,冲突会在合入时一次性爆掉。
# 要合进 dev 的功能 git fetch origin git switch dev git pull --ff-only origin dev git switch -c feature/cart # 要合进 main 的热修(不要从 dev 或某条 feature 上开) git fetch origin git switch main git pull --ff-only origin main git switch -c hotfix/pay-timeout # ❌ 人还停在 feature/old-ui 上,顺手 git switch -c feature/cart # 新分支会带着 old-ui 的提交,PR 合进 dev 时像一锅乱炖
# ✅ 好名字:一眼看懂类型和内容 feature/cart # 购物车功能 feature/order-export # 订单导出 fix/login-crash # 修登录崩溃(有的团队用 bugfix/) hotfix/pay-timeout # 线上支付超时热修 release/2.4.0 # 2.4.0 发布分支 # ❌ 坏名字:三天后没人(包括你)知道是干嘛的 dev2 test temp wang/backup new-branch-final-v3
规范靠自觉是守不住的。托管平台(GitHub / GitLab / Gitee)提供保护分支(protected branch)规则:对 main 和 dev 开启后,任何人(包括管理员)都无法直接 push,代码只能通过 Pull Request / Merge Request 进入,并可强制要求:至少 N 人 Review 通过、CI 全绿、分支必须先同步最新目标分支。第 0 章的事故里,甲丙的两次「顺手 push」在这道门前都会被物理拦下。
| 维度 | Git Flow | GitHub Flow | Trunk-Based |
|---|---|---|---|
| 长期分支 | main + develop 双主线,外加 feature / release / hotfix | 只有 main,一切改动走短命 feature 分支 | 只有 main(trunk),分支寿命 < 1–2 天甚至直接提交 |
| 发布方式 | 按版本周期发布(release 分支 + tag) | 合并即可部署,随时发布 | 持续部署,配合特性开关隐藏未完成功能 |
| 优点 | 职责最清晰,多版本并行维护从容 | 简单直白,学习成本最低 | 集成最频繁,冲突最小,交付最快 |
| 代价 | 流程重、分支多,小团队易被拖慢 | 多版本维护乏力 | 对自动化测试与 CI 成熟度要求极高 |
| 适合谁 | 按版本发布的中大型团队 / 客户端软件 | 持续部署的 Web 小团队(3–10 人) | 工程文化成熟的大厂 / 高频交付团队 |
本页教学采用最普遍的「简化 Git Flow」:main + dev + feature/hotfix——这是国内多数业务团队的实际形态,也正是你的团队描述的样子。
分支管住了「时间线」,提交信息管住「每个节点讲了什么」。Conventional Commits 约定 类型(范围): 描述 的格式,机器可解析(自动生成 changelog、语义化版本),人类可速读:
feat(cart): 支持批量加入购物车 # 新功能 fix(login): 修复验证码过期不提示 # 修 bug docs(readme): 补充本地启动步骤 # 只改文档 refactor(order): 拆分订单状态机 # 重构(不改行为) test(pay): 补支付回调的边界用例 # 只加测试 chore(deps): 升级 axios 到 1.8 # 杂务(构建/依赖等) # 破坏性变更:类型后加 "!",正文里写 BREAKING CHANGE: feat(api)!: 订单接口返回结构改为分页