研发协作
任何代码变更时的 Git 工作流与版本发布规范:原子提交…
在每次写代码、提交、开分支、解冲突、整理杂乱工作区、提 PR、打标签或发版时,用一套纪律化的 Git 实践保证变更可审查、可回滚、可追溯。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
任何代码变更时的 Git 工作流与版本发通用
解决思路
- 采用主干开发(Trunk-Based Development):保持 main 始终可部署,在 1-3 天内合并的短生命周期特性分支上工作;长期开发分支是隐性成本,会发散并产生合并冲突;发布分支在需要稳定版本时可以接受;不完整功能优先用功能开关(feature flags)而非长期分支。
- 尽早且频繁提交:每完成一个可工作的增量就提交一次(实现切片 → 测试 → 验证 → 提交 → 下一个切片),不要累积大量未提交变更,把提交当作存档点。
- 保证原子提交:每个提交只做一件逻辑上的事,例如分别提交「添加任务创建端点及校验」「添加任务创建表单组件」「连接表单到 API 并加加载状态」「添加任务创建测试」,避免把功能、修复、依赖更新、重构混在一个提交里。
- 写描述性提交信息:说明「为什么」而非「是什么」,格式为 `<type>: <简短描述>` 加可选正文;类型包括 feat(新功能)、fix(修复)、refactor(既不修 bug 也不加功能的重构)、test(测试)、docs(文档)、chore(工具、依赖、配置)。
- 分离关注点:不要把格式化变更与行为变更混在一起,不要把重构与功能混在一起,各自独立提交、最好独立 PR;重构与功能工作分开提交,便于审查、回滚和理解历史;小的清理(如重命名变量)经审查者同意可并入功能提交。
- 控制变更规模:每个提交/PR 目标约 100 行,单个逻辑变更可接受到约 300 行,超过约 1000 行必须拆分。
- 使用特性分支:从 main(或团队默认分支)拉出,每个分支只做一个功能,保持短生命周期(1-3 天内合并),合并后删除分支。
- 按约定命名分支:feature/<short-description>、fix/<short-description>、chore/<short-description>、refactor/<short-description>。
- 并行 AI 代理工作时使用 git worktree:用 `git worktree add ../project-feature-a feature/task-creation` 为每个分支创建独立目录,无需切换分支即可并行工作,实验失败直接删除 worktree,完成后 `git worktree remove ../project-feature-a` 清理。
- 采用存档点模式:每次改动后测试通过就提交、继续,测试失败就回退到上一个提交再排查;这样最多只丢失一个增量的工作,代理跑偏时用 `git reset --hard HEAD` 回到上次成功状态。
- 每次修改后提供结构化变更摘要:列出 CHANGES MADE(改了哪些文件、做了什么)、THINGS I DIDN'T TOUCH(有意未动的相关但超范围内容)、POTENTIAL CONCERNS(潜在风险与假设),以尽早暴露错误假设并体现范围纪律。
- 提交前做卫生检查:`git diff --staged` 查看暂存内容;用 `git diff --staged | grep -i "password\|secret\|api_key\|token"` 确认无密钥;运行 `npm test`、`npm run lint`、`npx tsc --noEmit`;用 lint-staged + husky 等 git hooks 自动化(如对 `*.{ts,tsx}` 执行 eslint --fix 和 prettier --write)。
- 妥善处理生成文件:仅当项目需要时才提交生成文件(如 package-lock.json、Prisma migrations);不要提交构建产物(dist/、.next/)、环境文件(.env)或 IDE 配置;.gitignore 应覆盖 node_modules/、dist/、.env、.env.local、*.pem。
- 用 Git 调试:用 `git bisect` 定位引入 bug 的提交;用 `git log --oneline -20` 和 `git diff HEAD~5..HEAD -- src/` 查看近期变更;用 `git blame` 查某行最后修改者;用 `git log --grep="validation" --oneline` 搜索提交信息。
- 对任何有消费者的代码采用语义化版本 MAJOR.MINOR.PATCH:MAJOR 为破坏性变更(消费者必须改代码)、MINOR 为向后兼容的新功能、PATCH 为向后兼容的修复;不确定是否破坏性时按破坏性处理(Hyrum 定律)。
- 发布时打标签并让标签成为唯一事实来源:用 `git tag -a v1.4.0 -m "Release 1.4.0"` 和 `git push origin v1.4.0`,版本号从标签派生而非手工编辑散落各处的文件,保证产物、标签、变更日志一致。
- 维护面向人类的变更日志:不是 git log,而是按 Added/Changed/Fixed/Deprecated/Removed/Security 分组、最新在上的精选条目,每条围绕用户影响而非内部实现;在做出变更的同一次改动中写条目,破坏性变更附迁移说明和弃用窗口。
适用边界 · 注意事项
- 团队使用 gitflow 或长期分支模型时,不必强行改为主干开发,但应保留原子提交、小变更、描述性信息等提交纪律。
- 没有外部消费者、纯本地实验性代码无需严格的语义化版本与变更日志流程。
- 不要用长期分支承载不完整功能,应改用功能开关。