团队工作流
Git 非常灵活,但团队协作需要约定:分支怎么建、什么时候合并、提交说明怎么写。本章介绍几种主流的工作流和提交规范。
GitHub Flow
GitHub Flow 是最简单、最流行的工作流,适合持续部署的项目:
main分支始终保持可部署状态;- 开发新功能或修复时,从
main创建一个描述性命名的分支; - 在分支上提交,并定期推送到远程;
- 需要反馈或准备合并时,发起 Pull Request(PR,在 GitLab/Gitee 中叫 Merge Request);
- 经过代码评审、自动化测试通过后,合并到
main; - 合并后立即部署。
git switch main
git pull
git switch -c feature/search
# ... 开发、提交 ...
git push -u origin feature/search
# 然后在网页上发起 Pull RequestGit Flow
Git Flow 是一种更严格的模型,适合有明确版本发布周期的项目(如客户端软件)。它定义了以下分支:
| 分支 | 用途 | 生命周期 |
|---|---|---|
main | 只存放正式发布的版本,每个提交都打标签 | 长期 |
develop | 日常开发的集成分支 | 长期 |
feature/* | 从 develop 分出,完成后合回 develop | 临时 |
release/* | 从 develop 分出,用于发布前测试和修复,完成后合入 main 和 develop | 临时 |
hotfix/* | 从 main 分出,用于紧急修复,完成后合入 main 和 develop | 临时 |
Git Flow 结构清晰,但分支较多、流程较重。对于 Web 应用这类持续交付的项目,通常 GitHub Flow 就足够了。
主干开发(Trunk-Based Development)
所有开发者都频繁(每天至少一次)地向主干提交小的改动,功能分支存活时间极短(通常不超过一两天)。未完成的功能通过**特性开关(Feature Flag)**隐藏。这种方式要求有完善的自动化测试和持续集成,是很多大型互联网公司采用的模式。
Fork + Pull Request
参与开源项目时,你通常没有直接推送的权限,流程是:
# 1. 在 GitHub 上 Fork 项目到自己的账号下
# 2. 克隆自己的 Fork
git clone [email protected]:zhangsan/project.git
cd project
# 3. 添加原始仓库为 upstream
git remote add upstream https://github.com/original/project.git
# 4. 创建分支并开发
git switch -c fix/typo
git commit -am "修复文档拼写错误"
git push -u origin fix/typo
# 5. 在 GitHub 上向原始仓库发起 Pull Request保持 Fork 与原始仓库同步:
git fetch upstream
git switch main
git merge upstream/main
git push origin main提交信息规范
清晰的提交说明是团队协作的基础。目前最广泛使用的是 Conventional Commits(约定式提交) 规范:
<类型>(<范围>): <描述>
[正文]
[脚注]常用类型:
| 类型 | 含义 |
|---|---|
feat | 新功能 |
fix | 修复 Bug |
docs | 文档变更 |
style | 代码格式(不影响逻辑) |
refactor | 重构(既不是新功能也不是修复) |
perf | 性能优化 |
test | 添加或修改测试 |
build | 构建系统或外部依赖变更 |
ci | 持续集成配置变更 |
chore | 其他杂项 |
示例:
feat(auth): 支持手机验证码登录
用户可以通过手机号 + 短信验证码的方式登录,
验证码有效期 5 分钟。
Closes #128有破坏性变更时,在类型后加 ! 或在脚注写 BREAKING CHANGE::
feat(api)!: 用户接口返回结构调整遵循这一规范后,可以借助工具自动生成 CHANGELOG、自动确定语义化版本号。
好的实践
- 提交要小而专注:一个提交只做一件事,便于评审和回滚;
- 经常提交、经常推送:减少冲突,也避免本地数据丢失;
- 提交前自查:用
git diff --staged检查即将提交的内容; - 不要提交生成的文件和密钥:善用
.gitignore; - 保护主分支:在托管平台上开启分支保护,要求 PR 评审和 CI 通过才能合并;
- 公共分支不要强制推送。