场景描述

  • 项目:开发一个博客系统,包含用户登录、文章发布和评论功能。

  • 团队:3 名开发者(Alice、Bob、Charlie),使用 GitHub 作为代码托管平台,GitHub Actions 作为 CI/CD 工具。

  • 目标:实现用户登录功能,并确保代码高质量、高效协作。


1. 项目初始化与规范设定

为了确保团队协作高效,项目开始时需要设定 Git 规范和仓库结构。

创建仓库:

  • Alice 在 GitHub 上创建仓库 blog-system

  • 初始化本地仓库:

    git init blog-system
    cd blog-system

设置 .gitignore

  • 创建 .gitignore 文件,排除无关文件(如 node_modules, .env):

    node_modules/
    .env
    dist/
    *.log

初始化主分支:

  • 创建初始文件(如 README.md, package.json),提交并推送:

    git add .
    git commit -m "chore: initialize project with README and .gitignore"
    git branch -M main
    git remote add origin https://github.com/team/blog-system.git
    git push -u origin main

设定分支保护规则:

  • 在 GitHub 上设置 main 分支保护:

    • 要求 Pull Request (PR) 审查。

    • 要求通过 CI 测试才能合并。

团队规范:

  • 约定分支命名:feature/<功能名>, bugfix/<问题编号>, hotfix/<问题描述>

  • 提交信息规范:使用 Angular 风格,如 feat: add login endpoint, fix: resolve login bug #123

  • 文档化规范:在 README.md 或 GitHub Wiki 中记录。


2. 功能开发:

用户登录Alice 负责开发用户登录功能(前端页面 + 后端 API),Bob 负责代码审查,Charlie 配置 CI/CD。步骤:

创建特性分支:

  • Alice 创建并切换到新分支:

    git checkout -b feature/user-login

开发代码:

  • Alice 开发前端登录页面(React)和后端 API(Node.js)。

  • 提交代码(小步提交):

    # 提交前端代码
    git add src/components/Login.js
    git commit -m "feat: add login page UI"
    
    # 提交后端代码
    git add src/api/auth.js
    git commit -m "feat: add login endpoint with JWT"

同步远程代码:

  • 为避免冲突,Alice 定期拉取 main 分支更新:

    git checkout main
    git pull origin main
    git checkout feature/user-login
    git rebase main
  • 如果有冲突,解决后继续:

    git rebase --continue

推送分支:

  • 开发完成后,推送到远程:

    git push origin feature/user-login

3. 代码审查与质量控制

Alice 提交 Pull Request,Bob 进行审查,Charlie 配置自动化测试。步骤:

创建 Pull Request:

  • Alice 在 GitHub 上创建 PR,从 feature/user-loginmain

  • PR 标题:Add user login functionality

  • PR 描述:列出功能点、测试方法和相关 issue(如 #123)。

代码审查:

  • Bob 检查代码,重点关注:

    • 代码规范(是否符合 ESLint 规则)。

    • 功能完整性(登录是否支持多种场景,如错误处理)。

    • 安全性(密码加密、JWT 验证)。

  • Bob 提出建议,例如“在 Login.js 中添加输入验证”。

  • Alice 修改代码并提交:

    git add src/components/Login.js
    git commit -m "fix: add input validation to login form"
    git push origin feature/user-login

自动化检查:

  • Charlie 配置 GitHub Actions,自动运行测试和 lint:

    name: CI
    on:
      pull_request:
        branches: [main]
    jobs:
      test:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - name: Setup Node.js
            uses: actions/setup-node@v3
            with:
              node-version: '16'
          - run: npm install
          - run: npm test
          - run: npm run lint
  • 如果测试失败,Alice 修复问题并重新提交。

合并 PR:

  • 测试通过,Bob 批准 PR,Alice 合并到 main

    bash

    git checkout main
    git pull origin main
    git merge feature/user-login
    git push origin main
  • 删除分支:

    bash

    git push origin --delete feature/user-login
    git branch -d feature/user-login

4. 版本控制与回滚

假设合并后发现登录 API 有 bug(例如 JWT 过期时间错误),需要快速修复。步骤:

创建修复分支:

  • Alice 创建修复分支:

    git checkout -b hotfix/jwt-expiry

修复并提交:

  • 修改 src/api/auth.js,调整 JWT 过期时间。

  • 提交:

    git add src/api/auth.js
    git commit -m "fix: correct JWT expiry time"
    git push origin hotfix/jwt-expiry

PR 和合并:

  • 创建 PR,Bob 审查,CI 测试通过后合并到 main

打标签:

  • 为修复后的版本打标签:

    git tag v1.0.1
    git push origin v1.0.1

回滚(如果需要):

  • 如果修复失败,可回滚到上一个稳定版本:

    git revert <commit-hash>
    git push origin main

5. 提高效率的工具与技巧

团队使用以下方法优化 Git 使用:

Git 别名:

  • Alice 配置别名,简化常用命令:

    git config --global alias.st status
    git config --global alias.cm "commit -m"
    git config --global alias.br branch
  • 示例:git st 查看状态,git cm "fix: update code" 快速提交。

交互式 Rebase:

  • Alice 在提交 PR 前整理提交历史,合并琐碎提交:

    git rebase -i HEAD~3
  • 将多个提交合并为一个清晰的提交,如 feat: complete login functionality

Git Hooks:

  • Charlie 配置 pre-commit 钩子,自动运行 ESLint 和单元测试:

    bash

    # .git/hooks/pre-commit
    #!/bin/sh
    npm run lint
    npm test

可视化工具:

  • Bob 使用 VS Code 的 Git 插件,查看差异和提交历史。

  • Charlie 使用 GitKraken 可视化分支结构,快速切换分支。


6. 部署与持续集成

Charlie 配置 CI/CD 管道,自动部署到生产环境。

配置 GitHub Actions:

  • 部署到 AWS:

    name: Deploy
    on:
      push:
        branches: [main]
    jobs:
      deploy:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - name: Deploy to AWS
            run: |
              aws s3 sync ./dist s3://blog-system-bucket

验证部署:

  • 部署后,团队测试登录功能,确保生产环境正常。


7. 常见问题应对

合并冲突:

  • 假设 Bob 的 feature/comments 和 Alice 的 feature/user-login 冲突:

    git checkout feature/user-login
    git merge feature/comments
    # 手动解决冲突
    git add .
    git commit

误删代码:

  • 使用 git reflog 找回丢失的提交:

    git reflog
    git reset --hard <commit-hash>

调试问题:

  • 使用 git bisect 定位引入 bug 的提交:

    bash

    git bisect start
    git bisect bad
    git bisect good v1.0.0