Files
zhuangang/topics/devops/git/01-branch-commit.md
T

67 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: devops.git.branch-commit
title: 分支模型和提交规范:主干开发、Git Flow、Conventional Commits、代码评审
type: lesson
domain: devops
stack: [git]
tags: [分支模型, Git Flow, 主干开发, 提交规范, Code Review]
level: basic
est_hours: 1.5
related: [devops.git.merge-rebase-recovery, devops.cicd.pipeline, devops.git.interview]
week: [1, 8]
order: 1
---
# 分支模型和提交规范:主干开发、Git Flow、Conventional Commits、代码评审
## 解释说明
**分支模型**
| 模型 | 做法 | 适合 |
| --- | --- | --- |
| 主干开发(Trunk-Based) | 所有人基于 main 开短期功能分支(一两天内合并),未完成的功能用特性开关隐藏 | 有完善 CI、持续部署的团队 |
| GitHub Flow | main 永远可发布;功能分支 → 合并请求 → 评审 → 合并 → 部署 | 大多数 Web 项目 |
| Git Flow | `main`(发布)、`develop`(集成)、`feature/*`、`release/*`、`hotfix/*` | 有固定版本发布周期(App、客户端、私有化交付) |
**提交规范(Conventional Commits)**:`类型(范围): 描述`,类型常用 `feat`、`fix`、`docs`、`refactor`、`test`、`chore`、`perf`。好处:历史清晰、能自动生成变更日志、方便按类型筛选。
**好的提交**:一个提交只做一件事;提交信息说明“为什么”而不只是“改了什么”;不要把格式化和逻辑改动混在一起;不要提交生成文件、依赖目录和密钥(`.gitignore`)。
**合并请求和代码评审**:合并请求小而聚焦(几百行以内);描述写清背景、改动、测试方式;CI 通过 + 至少一人评审才能合并;main 分支开启保护,禁止直接推送和强制推送。
## 案例
本学习仓库的约定:直接在 main 上提交(个人项目),提交信息用中文描述;每个阶段完成后提交一次并推送;提交前运行 `tools/build_catalog.py --check` 和 `tools/check_sensitive.py` 检查内容规范和敏感信息。团队项目则用 GitHub Flow:`feat/xxx` 分支 → 合并请求 → CI + 评审 → squash 合并。
## 代码示例
```bash
# 功能分支开发
git switch -c feat/order-export
git add -p # 按块挑选要提交的改动,避免把调试代码带进去
git commit -m "feat(order): 支持按月导出订单" -m "运营需要按月对账,导出改为异步任务,避免接口超时"
git push -u origin feat/order-export # 然后在平台上创建合并请求
# 全局忽略编辑器和系统文件
git config --global core.excludesFile ~/.gitignore_global
printf '.DS_Store\n.idea/\n.vscode/\n' >> ~/.gitignore_global
# 提交前钩子:.git/hooks/pre-commit(或用 pre-commit 框架统一管理)
#!/bin/sh
python3 tools/check_sensitive.py || exit 1
```
## 易错点
- **一个提交几千行、混合多件事**:没法评审,出问题也没法单独回滚。
- **提交信息写“update”“fix bug”**:半年后没人知道改了什么。
- **长期不合并的功能分支**:和 main 差异越来越大,最后合并冲突无数。
- **把 `.env`、密钥、大文件提交进仓库**:删除也会留在历史里。
- **在公共分支上强制推送**:覆盖别人的提交。
- **把 `node_modules`、构建产物提交**:仓库膨胀、冲突频繁。
## 面试常问
见 [Git 面试题](interview.md):你们用什么分支模型、提交规范、怎么做代码评审。