Skip to content

Git 工作流实践指南

在团队协作开发中,一个规范、高效的 Git 工作流对于提高开发效率和代码质量至关重要。本文将介绍几种常见的 Git 工作流模型及其最佳实践。

Git Flow 工作流

Git Flow 是最早广泛使用的 Git 分支管理模型,由 Vincent Driessen 在 2010 年提出。它定义了一套标准的分支结构和操作规范。

核心分支

  • master/main: 主分支,只存放正式发布的版本
  • develop: 开发分支,最新的开发代码
  • feature/*: 功能分支,用于开发特定功能
  • release/*: 发布分支,用于准备发布版本
  • hotfix/*: 热修复分支,用于修复生产环境中的问题

工作流程

  1. develop 分支创建 feature 分支进行功能开发
  2. 功能完成后合并回 develop 分支
  3. 当准备发布时,从 develop 创建 release 分支
  4. release 分支上进行最后的测试和修复
  5. 发布完成后,将 release 分支合并到 masterdevelop
  6. 如需紧急修复生产问题,从 master 创建 hotfix 分支
  7. 修复完成后,将 hotfix 分支合并到 masterdevelop

示例命令

bash
# 创建功能分支
git checkout -b feature/login develop

# 完成功能后合并回开发分支
git checkout develop
git merge --no-ff feature/login
git branch -d feature/login

# 创建发布分支
git checkout -b release/1.0.0 develop

# 发布完成后合并到主分支
git checkout main
git merge --no-ff release/1.0.0
git tag -a v1.0.0
git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0

GitHub Flow 工作流

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

核心分支

  • main: 主分支,保持可部署状态
  • feature分支: 任何功能或修复都在独立的分支进行

工作流程

  1. main 分支创建功能分支
  2. 在分支上开发,提交修改
  3. 创建 Pull Request (PR)
  4. 代码审查和讨论
  5. 部署和测试
  6. 合并到 main 分支

示例命令

bash
# 创建并切换到功能分支
git checkout -b feature-name

# 提交更改
git add .
git commit -m "实现了XX功能"

# 推送分支到远程仓库
git push -u origin feature-name

# 在GitHub上创建PR,代码审查后合并

GitLab Flow 工作流

GitLab Flow 结合了 Git Flow 和 GitHub Flow 的优点,并增加了环境分支的概念。

核心分支

  • main: 主分支,对应最稳定代码
  • production: 生产环境分支
  • pre-production: 预生产环境分支
  • feature分支: 功能开发分支

工作流程

  1. main 分支创建功能分支
  2. 开发完成后通过 Merge Request (MR) 合并到 main
  3. 合并到 main 后自动部署到测试环境
  4. 准备发布时,将代码从 main 合并到 pre-production
  5. 测试通过后,将代码从 pre-production 合并到 production

示例命令

bash
# 创建功能分支
git checkout -b feature-name main

# 完成功能并提交
git add .
git commit -m "完成功能开发"
git push origin feature-name

# 在GitLab上创建MR到main分支
# 合并后,代码自动部署到测试环境

# 准备发布到预生产环境
git checkout pre-production
git merge --no-ff main
git push origin pre-production

# 发布到生产环境
git checkout production
git merge --no-ff pre-production
git push origin production

实用技巧和最佳实践

1. 编写有意义的提交信息

一个好的提交信息应该清晰描述做了什么以及为什么做这些改动:

bash
# 不好的例子
git commit -m "修复bug"

# 好的例子
git commit -m "修复: 用户注册时邮箱验证失败问题 (#123)"

建议使用约定式提交规范(Conventional Commits):

  • feat: 新功能
  • fix: 修复
  • docs: 文档变更
  • style: 代码格式变更
  • refactor: 代码重构
  • perf: 性能优化
  • test: 测试相关
  • chore: 工具相关

2. 使用交互式变基保持历史整洁

在合并到主分支前,可以使用交互式变基整理提交历史:

bash
# 整理最近的4个提交
git rebase -i HEAD~4

常用操作:

  • pick: 保留该提交
  • squash: 将提交合并到前一个提交
  • reword: 修改提交信息
  • fixup: 合并到前一个提交,丢弃提交信息

3. 善用 Git Hooks

使用 Git 钩子可以在特定操作前后自动执行脚本:

  • pre-commit: 提交前执行代码检查
  • pre-push: 推送前运行测试
  • commit-msg: 验证提交信息格式

可以使用 Husky 和 lint-staged 等工具简化配置:

json
// package.json 示例
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  },
  "lint-staged": {
    "*.{js,vue}": ["eslint --fix", "prettier --write"]
  }
}

4. 解决冲突的最佳实践

  1. 频繁合并主分支:定期将主分支合并到你的功能分支,以减少冲突
  2. 理解冲突标记<<<<<<< HEAD, =======, >>>>>>> branch-name
  3. 使用工具:借助 VS Code, IntelliJ 等 IDE 的冲突解决工具
  4. 测试解决方案:解决冲突后,确保代码能正常工作
bash
# 将主分支最新代码合并到功能分支
git checkout feature-branch
git fetch origin
git merge origin/main

# 解决冲突后
git add .
git commit -m "解决合并冲突"

5. 保护重要分支

在 GitHub、GitLab 等平台中,可以设置分支保护规则:

  • 禁止直接推送到主分支
  • 要求代码审查和批准
  • 要求通过自动化测试
  • 要求提交签名

团队协作中的最佳实践

代码审查指南

  1. 小批量审查:每次 PR/MR 控制在 200-400 行代码以内
  2. 明确重点:关注代码结构、安全性、性能,而非风格(使用 linter)
  3. 及时审查:争取在 24 小时内完成审查
  4. 友善沟通:提供建设性意见,避免指责性语言

版本管理策略

  1. 语义化版本:采用 主版本.次版本.修订号 (例如 2.1.3)

    • 主版本:不兼容的 API 修改
    • 次版本:向下兼容的功能新增
    • 修订号:向下兼容的问题修正
  2. 创建标签和发布:为每个正式版本创建 Git 标签

bash
git tag -a v1.2.3 -m "发布版本 1.2.3"
git push origin v1.2.3

持续集成/持续部署 (CI/CD)

将 Git 工作流与 CI/CD 系统集成,实现自动化测试和部署:

yaml
# .github/workflows/ci.yml 示例
name: CI

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup Node.js
      uses: actions/setup-node@v1
      with:
        node-version: 16
    - name: Install dependencies
      run: npm ci
    - name: Run tests
      run: npm test
    - name: Build
      run: npm run build

常见问题与解决方案

1. 意外提交到错误分支

bash
# 保存当前更改
git stash

# 切换到正确的分支
git checkout correct-branch

# 应用更改
git stash pop

# 重新提交
git add .
git commit -m "正确的提交信息"

2. 需要撤销已推送的提交

bash
# 创建回滚提交
git revert <commit-hash>

# 或者使用重置(慎用!会改变历史)
git reset --hard <commit-hash>
git push --force-with-lease

3. 找回丢失的提交

bash
# 查看所有操作历史
git reflog

# 恢复到特定状态
git checkout <reflog-hash>

结论

选择适合团队的 Git 工作流非常重要,没有一种工作流适合所有团队。对于大型项目,可能需要 Git Flow 这样的结构化流程;而对于敏捷开发和持续部署,GitHub Flow 或 GitLab Flow 可能更合适。

最重要的是,团队成员应该理解并一致遵守所选的工作流程,使用统一的约定和标准,这样才能充分发挥 Git 在团队协作中的优势。

参考资料