Git 工作流
Git 记录的是可审计的变更历史,而不只是备份。本篇固定分支命名、提交信息、PR 与发布标签的默认约定,便于个人项目与协作仓库共用同一套肌肉记忆。
分支模型(默认)
| 分支 | 用途 | 合并目标 |
|---|---|---|
main | 可随时部署/发布的稳定线 | — |
feature/* | 单一需求或修复 | main(经 PR) |
fix/* | 生产热修(可选) | main + 必要时 cherry-pick |
release/* | 版本冻结、仅修 blocker(可选) | main + tag |
个人仓库简化:直接在 main 上小步提交也可;功能变大时再切 feature/。
提示
短分支:存活 < 3 天优先,减少长期 merge 冲突。每日 git fetch + 基于最新 main rebase 或 merge(团队选一种并统一)。
提交信息
采用 Conventional Commits 子集,便于 changelog 与语义化版本:
<type>(<scope>): <subject>
<body 可选>
| type | 含义 |
|---|---|
feat | 新能力 |
fix | 缺陷修复 |
docs | 仅文档 |
refactor | 行为不变的重构 |
test | 测试 |
chore | 构建、依赖、杂项 |
subject:祈使句、≤72 字符、无句号;说明「做了什么」而非「做了什么+为什么长篇」。
Pull Request 清单
- 范围单一:一个 PR 解决一个问题
- CI 绿:lint、测试、契约(如有)
- 描述含:动机、方案摘要、如何验证、关联 issue
- 破坏性变更在标题或标签标明
BREAKING - 大 diff 附架构/数据迁移说明
评审时优先看:边界是否被跨过、测试是否覆盖行为变化、回滚是否简单(见 边界)。
合并策略
| 策略 | 优点 | 注意 |
|---|---|---|
| Squash merge | main 历史干净 | 丢失细粒度提交;PR 标题要写好 |
| Rebase merge | 线性历史 | 禁止改写已推送的公共分支 |
| Merge commit | 保留分支拓扑 | 历史噪声多 |
默认推荐:面向产品的 main 用 squash;开源库若需保留贡献者 commit 用 merge。
标签与发布
| 标签 | 语义 |
|---|---|
vMAJOR.MINOR.PATCH | 语义化版本 |
v1.2.3-rc.1 | 预发布 |
发布步骤简表:
- 从
main打 tag 并推送 - CI 构建产物 / 镜像 / App Store 构建号
- 附 release notes(可从 conventional commits 生成)
安全与卫生
- 不提交密钥、
.env本地覆盖;用.env.example文档化变量 - 敏感文件进
.gitignore;误提交立即轮换密钥 +git filter-repo(慎用 force push) - 签名提交(可选):GPG/SSH sign 提高供应链可信度