Git 工作流与团队协作
2026/3/20大约 8 分钟
Git 工作流与团队协作
建立高效的团队开发流程
团队协作基础
协作模式概览
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 集中式协作 | 所有开发者直接推送到中央仓库 | 小团队、私有项目 |
| 分布式协作 | 开发者在自己的 Fork 中开发,通过 PR 贡献 | 开源项目、大型团队 |
角色与权限
| 角色 | 权限 | 职责 |
|---|---|---|
| Owner/Admin | 完全控制、删除仓库 | 仓库管理、权限分配、规则制定 |
| Maintainer | 合并 PR、管理分支、发布版本 | 代码审查、质量把关、解决冲突 |
| Developer | 推送分支、创建 PR、代码审查 | 功能开发、Bug 修复、测试 |
| Contributor(外部) | Fork、提交 PR | 贡献代码、报告问题 |
| Viewer | 只读访问 | 查看代码 |
工作流模型详解
Feature Branch 工作流
最基础的分支工作流,每个功能在独立分支开发。
# 开发流程
# 1. 同步主分支
git checkout main
git pull origin main
# 2. 创建功能分支
git checkout -b feature/user-authentication
# 3. 开发并提交
git add .
git commit -m "feat: add login form"
git commit -m "feat: add authentication service"
git commit -m "test: add auth tests"
# 4. 保持与主分支同步
git fetch origin
git rebase origin/main
# 5. 推送分支
git push -u origin feature/user-authentication
# 6. 创建 Pull Request
# 7. 代码审查后合并
# 8. 清理
git checkout main
git pull origin main
git branch -d feature/user-authentication
Git Flow 详细实践
| 分支 | 说明 |
|---|---|
| main | 生产环境代码,每个合并都打标签 |
| develop | 开发主分支,包含最新开发完成的功能 |
| feature | 功能分支,从 develop 创建,合并回 develop |
| release | 发布分支,从 develop 创建,合并到 main 和 develop |
| hotfix | 热修复分支,从 main 创建,合并到 main 和 develop |
Git Flow 操作命令
# === 功能开发 ===
# 开始新功能
git checkout develop
git pull origin develop
git checkout -b feature/new-feature
# 开发完成
git checkout develop
git pull origin develop
git merge --no-ff feature/new-feature
git push origin develop
git branch -d feature/new-feature
# === 发布准备 ===
# 开始发布
git checkout develop
git checkout -b release/1.2.0
# 发布准备(版本号更新、小修复)
git commit -m "chore: bump version to 1.2.0"
# 完成发布
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release 1.2.0"
git push origin main --tags
git checkout develop
git merge --no-ff release/1.2.0
git push origin develop
git branch -d release/1.2.0
# === 热修复 ===
# 开始热修复
git checkout main
git checkout -b hotfix/fix-critical-bug
# 修复
git commit -m "fix: resolve critical bug"
# 完成热修复
git checkout main
git merge --no-ff hotfix/fix-critical-bug
git tag -a v1.2.1 -m "Hotfix 1.2.1"
git push origin main --tags
git checkout develop
git merge --no-ff hotfix/fix-critical-bug
git push origin develop
git branch -d hotfix/fix-critical-bug
GitHub Flow 详细实践
GitHub Flow 原则:
- main 分支始终可部署
- 从 main 创建描述性命名的分支
- 定期推送到远程同名分支
- 随时可以开启 Pull Request
- PR 获得审批后合并到 main
- 合并后立即部署
# GitHub Flow 实践
# 1. 创建分支
git checkout main
git pull
git checkout -b feature/add-shopping-cart
# 2. 开发并推送
git add .
git commit -m "feat: add cart component"
git push -u origin feature/add-shopping-cart
# 3. 创建 Pull Request
# 在 GitHub 网页创建,或使用 CLI
gh pr create --title "Add shopping cart" --body "Description..."
# 4. 讨论和审查
# 根据反馈修改
git add .
git commit -m "fix: address review comments"
git push
# 5. 合并
gh pr merge --squash
# 6. 部署(自动或手动)
# 7. 清理
git checkout main
git pull
git branch -d feature/add-shopping-cart
Trunk-Based Development
关键实践:
- 分支存活时间短(几小时到 1-2 天)
- 频繁集成到主干(每天多次)
- 使用 Feature Flags 控制功能发布
- 强大的自动化测试体系
- 持续集成/持续部署
Feature Flags 示例:
if (featureFlags.isEnabled("new-checkout")) {
return <NewCheckout />;
} else {
return <OldCheckout />;
}
审查反馈技巧
# 好的审查评论示例
## 必须修改
> 🔴 **BLOCKER**: 这里有 SQL 注入风险,需要使用参数化查询。
>
> ```javascript
> // 当前代码
> db.query(`SELECT * FROM users WHERE id = ${userId}`);
>
> // 建议修改
> db.query("SELECT * FROM users WHERE id = ?", [userId]);
> ```
## 建议修改
> 🟡 **SUGGESTION**: 这个函数可以拆分成更小的函数,提高可读性。
> 考虑将验证逻辑提取到 `validateInput()` 函数中。
## 小问题
> 🟢 **NIT**: 这里的变量名可以更具描述性,`d` 改为 `data` 如何?
## 提问
> ❓ **QUESTION**: 这里为什么使用 `setTimeout` 而不是 `Promise`?是否有特殊考虑?
## 赞扬
> 👍 这个算法实现很优雅,性能也很好!
审查工具配置
# .github/CODEOWNERS
# 默认审查者
* @team-lead
# 前端代码
/src/frontend/ @frontend-team
*.tsx @frontend-team
*.css @frontend-team
# 后端代码
/src/backend/ @backend-team
*.py @backend-team
# 基础设施
/infra/ @devops-team
Dockerfile @devops-team
*.yml @devops-team
# 敏感文件
/config/ @security-team @team-lead
# .github/pull_request_template.md
## 描述
<!-- 简要描述这个 PR 做了什么 -->
## 变更类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 破坏性变更
- [ ] 文档更新
## 测试
<!-- 描述如何测试这些变更 -->
## 检查清单
- [ ] 代码遵循项目规范
- [ ] 已添加/更新测试
- [ ] 已更新文档
- [ ] 所有测试通过
## 相关 Issue
Closes #
## 截图(如适用)
冲突解决策略
冲突类型与解决
| 冲突类型 | 描述 | 解决方法 |
|---|---|---|
| 内容冲突 | 同一行被不同修改 | 理解双方意图,选择或合并正确的实现 |
| 删除/修改冲突 | 一方删除,另一方修改 | 确认是否还需要,与相关开发者沟通 |
| 重命名冲突 | 同一文件被重命名为不同名称 | 决定使用哪个名称,更新所有引用 |
| 二进制文件冲突 | Git 无法自动合并 | 必须选择一个版本 |
内容冲突示例:
<<<<<<< HEAD
const value = calculateNew(x);
=======
const value = computeUpdated(x);
>>>>>>> feature-branch
二进制冲突解决:
git checkout --ours file.png # 使用我们的版本
git checkout --theirs file.png # 使用他们的版本
使用工具解决冲突
# 配置合并工具
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# 或使用其他工具
git config --global merge.tool kdiff3
git config --global merge.tool p4merge
# 启动合并工具
git mergetool
# VS Code 冲突解决
# 打开冲突文件,使用内置的 3-way merge
# Accept Current Change | Accept Incoming Change | Accept Both Changes
# 解决后
git add resolved-file.txt
git commit
预防冲突
# 1. 频繁同步
git fetch origin
git rebase origin/main # 每天至少一次
# 2. 小而频繁的提交
# 避免大规模重构和长期分支
# 3. 使用 rerere(重用记录的解决方案)
git config --global rerere.enabled true
# Git 会记住你如何解决冲突,下次自动应用
# 4. 及时沟通
# 当修改重要文件时,告知团队成员
发布管理
版本号规范(SemVer)
格式:MAJOR.MINOR.PATCH(例如:2.1.3)
| 版本类型 | 说明 | 示例 |
|---|---|---|
| MAJOR | 不兼容的 API 变更 | 1.1.0 → 2.0.0 |
| MINOR | 向后兼容的新功能 | 1.0.1 → 1.1.0 |
| PATCH | 向后兼容的 Bug 修复 | 1.0.0 → 1.0.1 |
预发布版本:
2.0.0-alpha.1— 内部测试2.0.0-beta.1— 外部测试2.0.0-rc.1— 发布候选
构建元数据:2.0.0+build.123、2.0.0-beta.1+build.456
发布流程
# 1. 准备发布分支
git checkout develop
git pull origin develop
git checkout -b release/2.1.0
# 2. 更新版本号
# 修改 package.json, version.py 等
npm version minor # 或手动修改
# 3. 更新 CHANGELOG
# 使用 conventional-changelog 或手动编写
# 4. 提交版本更新
git add .
git commit -m "chore: bump version to 2.1.0"
# 5. 测试和修复
# 运行完整测试,修复发现的问题
# 6. 合并到 main
git checkout main
git merge --no-ff release/2.1.0
# 7. 打标签
git tag -a v2.1.0 -m "Release 2.1.0"
# 8. 推送
git push origin main --tags
# 9. 合并回 develop
git checkout develop
git merge --no-ff release/2.1.0
git push origin develop
# 10. 删除发布分支
git branch -d release/2.1.0
# 11. 创建 GitHub Release(可选)
gh release create v2.1.0 --title "Version 2.1.0" --notes-file CHANGELOG.md
CHANGELOG 格式
# Changelog
All notable changes to this project will be documented in this file.
## [2.1.0] - 2024-03-15
### Added
- New user dashboard with analytics
- Export feature for reports
- Dark mode support
### Changed
- Improved performance of search feature
- Updated dependencies
### Fixed
- Login redirect issue on mobile
- Memory leak in chart component
### Security
- Fixed XSS vulnerability in comment section
## [2.0.1] - 2024-02-28
### Fixed
- Critical bug in payment processing
## [2.0.0] - 2024-02-15
### Changed
- **BREAKING**: Renamed `getUser()` to `fetchUser()`
- **BREAKING**: Minimum Node.js version is now 18
### Removed
- Deprecated `legacyAuth` module
[2.1.0]: https://github.com/user/repo/compare/v2.0.1...v2.1.0
[2.0.1]: https://github.com/user/repo/compare/v2.0.0...v2.0.1
[2.0.0]: https://github.com/user/repo/compare/v1.0.0...v2.0.0
团队规范模板
Git 使用规范
# Git 使用规范
## 分支命名
- 功能分支: `feature/<issue-id>-<description>`
- 修复分支: `fix/<issue-id>-<description>`
- 热修复: `hotfix/<issue-id>-<description>`
- 发布分支: `release/<version>`
示例:
- `feature/123-user-login`
- `fix/456-header-overflow`
- `hotfix/789-security-patch`
## 提交信息格式
```text
<type>(<scope>): <subject>
<body>
<footer>
```
Type
- feat: 新功能
- fix: Bug 修复
- docs: 文档更新
- style: 代码格式
- refactor: 重构
- perf: 性能优化
- test: 测试
- chore: 构建/工具
示例
feat(auth): add OAuth2 login support
- Add Google OAuth2 provider
- Add GitHub OAuth2 provider
- Update user model for OAuth
Closes #123
合并策略
- 功能分支合并使用 Squash Merge
- 发布分支合并使用 Merge Commit
- 禁止直接推送到 main 分支
代码审查要求
- 至少 1 位审查者批准
- 所有 CI 检查通过
- 无未解决的评论
敏感信息
- 禁止提交密码、密钥、令牌
- 使用 .env 文件存储敏感配置
- 确保 .env 在 .gitignore 中
---