Skip to main content

Git Workflow

一、为什么需要分支策略

  • 多人协作不互相阻塞
  • 主分支随时可发布
  • 紧急修复能快速上线
  • 代码 review 落地

二、常见分支模型

1. Git Flow(重量级)

适合有明确版本发布周期的产品。

master           ─────────────────●────●────●──→  (每次发布打 tag)
╲ ╱ ╲ ╱
release/1.2 ─────●─────────● ╲╱
╲ ╱ ╲ ╲╱
develop ──●────●────●────●─────────→
╲ ╱ ╲ ╱
feature/login ●──→ ●──→
╲ ╱
hotfix/pay-bug ●──→
  • master:生产环境代码
  • develop:开发主分支
  • feature/*:功能开发
  • release/*:发布准备
  • hotfix/*:紧急修复

缺点:分支多、流程重、对 CI 要求高。

2. GitHub Flow(轻量,推荐大多数团队)

适合持续部署的 web 项目。

main        ─────●────────●────────●────→  (始终可发布)
╱ ╱ ╱
feature/x ●─────→ ●──→ ●──→
  • main:生产分支
  • feature/*:任何新功能/修复都开 feature 分支
  • PR 合入 main 之前必须有 review + CI 通过
  • 合入 main 即部署

3. GitLab Flow

介于两者之间,有 production / pre-production / main 几条长分支。

三、推荐实践:Trunk Based + Feature Flag

main           ──●────●────●────●────→
╲ ╱
feature/pay ●───●──→

上线时通过 Feature Flag 渐进放量
  • 主分支开发,短命 feature 分支(< 2 天)
  • 复杂功能用 Feature Flag 控制(LaunchDarkly、自建配置中心)
  • 适合中大型团队 + 高频发布

四、Commit 规范

1. Conventional Commits

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

<body>

<footer>

type 取值:

type含义
feat新功能
fix修复 bug
perf性能优化
refactor重构
docs文档
style格式(不影响逻辑)
test测试
build构建/依赖
ciCI 配置
chore其他
revert回滚

示例:

feat(user): 支持微信登录

- 接入微信 OAuth
- 新增 wechat-login 组件
- 登录态存储到 localStorage

Closes #123

2. 自动化校验

commitlint + husky 在 commit 时校验(详见 统一编码规范)。

五、PR / Code Review

1. PR 标题

和 commit 规范一致:feat(user): 支持微信登录

2. PR 描述模板

## 背景
为什么做这个改动?

## 改动点
- 主要改动列表

## 测试
- [ ] 单元测试已加
- [ ] 自测通过
- [ ] 联调完成

## 截图 / 录屏
(如有 UI 改动)

## 风险
是否影响存量功能?是否需要数据迁移?

3. Review 关注点

  • 业务:是否符合需求、边界场景
  • 设计:是否符合现有架构、是否过度设计
  • 代码:命名、可读性、重复代码
  • 性能 / 安全:是否有明显问题
  • 测试:覆盖率、关键路径

六、紧急修复 Hotfix

# 1. 从 main 拉 hotfix 分支
git checkout main && git pull
git checkout -b hotfix/pay-bug

# 2. 修复 + 提交
git commit -m "fix(pay): 修复支付回调签名校验问题"

# 3. 合回 main(先合 main 再 cherry-pick 到 develop)
git checkout main
git merge --no-ff hotfix/pay-bug
git tag v1.2.1
git push origin main --tags

# 4. 同步到 develop
git checkout develop && git merge hotfix/pay-bug
git push origin develop

# 5. 清理
git branch -d hotfix/pay-bug

七、避坑指南

  1. 不要把本地 commit 直接 push 到 main:失去 review 机会
  2. rebase vs merge:个人 feature 分支用 rebase 保持线性历史;合入 main 用 merge 保留分支轨迹
  3. 大文件不要进 git:用 .gitignore 排除 node_modules / dist
  4. 敏感信息不要进 git.env / *.pem / *.key 走环境变量或密钥管理
  5. commit 要原子化:一个 commit 只做一件事,方便 revert 和 cherry-pick

八、面试高频

  • Q:rebase 和 merge 的区别?什么时候用? A:merge 保留分支历史,rebase 把当前分支的 commit 重新接到目标分支顶端,历史更线性。个人 feature 分支合入前用 rebase 整理;合入 main 时用 merge 保留合并记录。
  • Q:如何解决冲突? A:理解冲突背景 → 手动解决 → git addgit rebase --continue(rebase 时)或 git commit(merge 时)。避免长分支并行开发,减少冲突概率。
  • Q:为什么 main 分支要保持随时可发布? A:方便紧急回滚、灰度发布、持续部署。任何合入的代码必须经过 review + CI。