Git 工作流与团队协作最佳实践

Created on

前言

在现代软件开发中,Git 已成为版本控制的事实标准。然而,很多团队在使用 Git 时仍然存在诸多问题:提交信息混乱、分支管理无序、代码冲突频繁。本文将系统讲解 Git 工作流的最佳实践,帮助团队建立高效的协作流程。

Git Flow vs GitHub Flow

Git Flow

Git Flow 是由 Vincent Driessen 提出的分支管理模型,适合有明确发布周期的项目。

分支类型

master (main)     - 生产环境代码
develop           - 开发分支
feature/*         - 功能分支
release/*         - 发布分支
hotfix/*          - 紧急修复分支

完整工作流程

# 1. 从 develop 创建功能分支
git checkout develop
git pull origin develop
git checkout -b feature/user-authentication

# 2. 开发功能并提交
git add .
git commit -m "feat: implement user login"

# 3. 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/user-authentication
git push origin develop

# 4. 准备发布时创建 release 分支
git checkout -b release/v1.2.0 develop

# 5. 在 release 分支进行最后的测试和 bug 修复
git commit -m "fix: resolve login redirect issue"

# 6. 发布完成后合并到 master 和 develop
git checkout master
git merge --no-ff release/v1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"
git push origin master --tags

git checkout develop
git merge --no-ff release/v1.2.0
git push origin develop

# 7. 紧急修复时使用 hotfix 分支
git checkout -b hotfix/critical-bug master
git commit -m "fix: critical security vulnerability"
git checkout master
git merge --no-ff hotfix/critical-bug
git tag -a v1.2.1 -m "Hotfix version 1.2.1"
git checkout develop
git merge --no-ff hotfix/critical-bug

Git Flow 优缺点

优点

缺点

GitHub Flow

GitHub Flow 是一个更简化的工作流,适合持续部署的项目。

核心原则

main              - 始终可部署的代码
feature/*         - 功能分支

工作流程

# 1. 从 main 创建功能分支
git checkout main
git pull origin main
git checkout -b feature/add-payment

# 2. 开发并频繁推送
git add .
git commit -m "feat: add payment gateway integration"
git push origin feature/add-payment

# 3. 创建 Pull Request 进行代码审查

# 4. 审查通过后合并到 main
# (通常在 GitHub 网页上操作)

# 5. 自动部署到生产环境
# (通过 CI/CD 自动触发)

# 6. 删除功能分支
git branch -d feature/add-payment
git push origin --delete feature/add-payment

GitHub Flow 优缺点

优点

缺点

Commit Message 规范

Conventional Commits

采用 Conventional Commits 规范,让提交历史更清晰。

格式

<type>(<scope>): <subject>

<body>

<footer>

Type 类型

feat:     新功能
fix:      Bug 修复
docs:     文档更新
style:    代码格式(不影响代码运行)
refactor: 重构(既不是新功能也不是 Bug 修复)
perf:     性能优化
test:     测试相关
build:    构建系统或依赖更新
ci:       CI 配置文件和脚本
chore:    其他不修改 src test 的更改
revert:   回退提交

示例

# 简单提交
git commit -m "feat: add user registration"

# 带 scope 的提交
git commit -m "fix(auth): resolve token expiration issue"

# 完整提交
git commit -m "feat(payment): integrate Stripe payment gateway

- Add Stripe SDK
- Implement payment form component
- Add payment success/failure handling

Closes #123"

# Breaking Change
git commit -m "feat!: redesign API response structure

BREAKING CHANGE: API response now returns data in 'payload' field instead of 'data'"

使用 Commitizen

# 安装
npm install -g commitizen cz-conventional-changelog

# 初始化
commitizen init cz-conventional-changelog --save-dev --save-exact

# 使用
git add .
git cz  # 替代 git commit

使用 Commitlint

# 安装
npm install --save-dev @commitlint/cli @commitlint/config-conventional

# 配置 commitlint.config.js
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      ['feat', 'fix', 'docs', 'style', 'refactor', 'perf', 'test', 'build', 'ci', 'chore', 'revert']
    ],
    'subject-case': [0]
  }
};

# 配合 husky 使用
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit $1'

代码审查流程

Pull Request 最佳实践

PR 标题和描述

## Pull Request Title

feat(auth): implement OAuth 2.0 authentication

## Description

实现 OAuth 2.0 认证流程,支持 GitHub 和 Google 登录

## Changes

- [ ] 添加 OAuth SDK
- [ ] 实现登录回调处理
- [ ] 添加用户信息同步
- [ ] 编写单元测试

## Screenshots (if applicable)

[登录页面截图]

## Test Plan

1. 测试 GitHub 登录流程
2. 测试 Google 登录流程
3. 测试登录失败场景
4. 验证用户信息正确同步

## Related Issues

Closes #456
Related to #123

Code Review Checklist

## 代码审查清单

### 代码质量

- [ ] 代码逻辑清晰,易于理解
- [ ] 没有重复代码
- [ ] 变量和函数命名语义化
- [ ] 遵循项目代码规范

### 功能完整性

- [ ] 实现了需求的所有功能点
- [ ] 边界情况处理完善
- [ ] 错误处理得当

### 测试覆盖

- [ ] 包含充分的单元测试
- [ ] 测试覆盖率达标
- [ ] 测试用例覆盖边界情况

### 性能

- [ ] 没有性能瓶颈
- [ ] 没有内存泄漏
- [ ] 合理使用缓存

### 安全性

- [ ] 没有 SQL 注入风险
- [ ] 没有 XSS 漏洞
- [ ] 敏感信息加密存储

### 文档

- [ ] 更新相关文档
- [ ] 添加必要的注释
- [ ] 更新 CHANGELOG

Git Hooks 实战

常用 Git Hooks

# pre-commit: 提交前检查
# commit-msg: 提交信息检查
# pre-push: 推送前检查
# post-merge: 合并后操作

使用 Husky

# 安装
npm install --save-dev husky

# 初始化
npx husky install

# 添加 pre-commit hook
npx husky add .husky/pre-commit "npm run lint && npm run test"

# 添加 commit-msg hook
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit $1'

# 添加 pre-push hook
npx husky add .husky/pre-push "npm run test:unit"

lint-staged 配置

{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write", "git add"],
    "*.{css,scss,less}": ["stylelint --fix", "prettier --write", "git add"],
    "*.{md,json}": ["prettier --write", "git add"]
  }
}

冲突解决策略

预防冲突

# 1. 频繁同步主分支
git checkout feature/my-feature
git fetch origin
git rebase origin/develop

# 2. 小步提交,频繁推送
git add .
git commit -m "feat: implement part 1"
git push origin feature/my-feature

# 3. 及时合并小功能
# 不要让分支存活太久

解决冲突

# 方法 1: Rebase(推荐)
git checkout feature/my-feature
git rebase develop

# 出现冲突时
# 1. 手动解决冲突
# 2. git add <resolved-files>
# 3. git rebase --continue

# 方法 2: Merge
git checkout feature/my-feature
git merge develop

# 出现冲突时
# 1. 手动解决冲突
# 2. git add <resolved-files>
# 3. git commit

智能冲突解决

# 使用 rerere (reuse recorded resolution)
git config --global rerere.enabled true

# Git 会记住你如何解决冲突,下次自动应用

团队协作技巧

1. 分支命名规范

# 功能分支
feature/user-authentication
feature/payment-gateway
feature/admin-dashboard

# Bug 修复
fix/login-redirect-error
fix/payment-calculation-bug

# 性能优化
perf/optimize-image-loading
perf/reduce-bundle-size

# 重构
refactor/extract-auth-logic
refactor/reorganize-components

# 文档
docs/update-api-documentation
docs/add-deployment-guide

2. 标签管理

# 语义化版本标签
git tag -a v1.0.0 -m "Release version 1.0.0"
git tag -a v1.1.0 -m "Feature release"
git tag -a v1.1.1 -m "Bug fix release"

# 推送标签
git push origin v1.0.0
git push origin --tags

# 列出标签
git tag -l "v1.*"

# 删除标签
git tag -d v1.0.0
git push origin :refs/tags/v1.0.0

3. Cherry-pick 技巧

# 将特定提交应用到当前分支
git cherry-pick <commit-hash>

# Cherry-pick 多个提交
git cherry-pick <commit1> <commit2>

# Cherry-pick 一个范围
git cherry-pick <start-commit>..<end-commit>

# 发生冲突时
git cherry-pick --continue  # 解决冲突后继续
git cherry-pick --abort     # 放弃 cherry-pick

4. Stash 使用

# 暂存当前修改
git stash

# 暂存并添加描述
git stash save "WIP: implementing feature X"

# 查看 stash 列表
git stash list

# 应用最近的 stash
git stash pop

# 应用特定 stash
git stash apply stash@{2}

# 删除 stash
git stash drop stash@{0}

# 清空所有 stash
git stash clear

高级技巧

1. Interactive Rebase

# 修改最近 3 个提交
git rebase -i HEAD~3

# 在编辑器中可以进行:
# pick   - 保留提交
# reword - 修改提交信息
# edit   - 修改提交内容
# squash - 合并到上一个提交
# drop   - 删除提交

2. Bisect 调试

# 二分查找引入 bug 的提交
git bisect start
git bisect bad                # 当前版本有 bug
git bisect good v1.0.0        # v1.0.0 版本正常

# Git 会自动切换到中间的提交
# 测试后标记:
git bisect good  # 或 git bisect bad

# 找到问题提交后
git bisect reset

3. Worktree 并行开发

# 创建新的工作树
git worktree add ../project-hotfix hotfix/critical-bug

# 在新目录中工作
cd ../project-hotfix
# 进行修复...

# 完成后删除工作树
git worktree remove ../project-hotfix

4. Reflog 恢复误删

# 查看所有操作历史
git reflog

# 恢复到特定状态
git reset --hard HEAD@{5}

# 恢复误删的分支
git checkout -b recovered-branch <commit-hash>

CI/CD 集成

GitHub Actions 示例

name: CI

on:
  pull_request:
    branches: [main, develop]
  push:
    branches: [main, develop]

jobs:
  lint-and-test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: "18"
          cache: "npm"

      - name: Install dependencies
        run: npm ci

      - name: Lint
        run: npm run lint

      - name: Test
        run: npm run test:coverage

      - name: Upload coverage
        uses: codecov/codecov-action@v3

总结

高效的 Git 工作流需要:

  1. 选择合适的分支策略:根据项目特点选择 Git Flow 或 GitHub Flow
  2. 规范提交信息:使用 Conventional Commits 规范
  3. 完善代码审查:建立 PR 审查流程和标准
  4. 自动化检查:使用 Git Hooks 和 CI/CD
  5. 团队培训:确保团队成员理解并遵循规范

记住:好的工作流不是最复杂的,而是最适合团队的。

参考资源