16、Git工作流(二):GitHub Flow、GitLab Flow、Forking工作流(开源项目协作模式)

上一章我们聊了 Git Flow,那个分支模型确实经典,但说实话,我在实际项目中很少用它。为什么?因为太复杂了。对于大多数团队来说,尤其是做持续交付的团队,Git Flow 的 release 分支和 hotfix 分支反而成了负担。

这一章,我带你看看另外三种更轻量、更贴合现代 DevOps 理念的工作流:GitHub Flow、GitLab Flow,以及开源项目里最常见的 Forking 工作流。

GitHub Flow:极简主义的代表

GitHub Flow 是 GitHub 官方推荐的工作流。它有多简单?只有一个长期分支——main(或者叫 master)。

我刚开始用 GitHub Flow 时,心里也犯嘀咕:就一个主分支,够用吗?后来发现,其实大部分场景真的够了。

核心规则

  1. main 分支永远是可部署的。这是铁律,谁都不能往 main 上直接 push 有问题的代码。
  2. 从 main 拉取 feature 分支。你要开发新功能,就从 main 切出来。
  3. 定期 push 到远程。别憋在本地,早点让大家看到你的进度。
  4. 提交 Pull Request。这是代码审查和讨论的入口。
  5. 合并到 main 后立即部署。理想情况下,合并即上线。

我个人习惯:在 GitHub Flow 里,PR 的标题就是 commit message 的浓缩版。我会在 PR 描述里写清楚「为什么改」和「怎么改」,而不是只写「修复了 bug」。这样 reviewer 看起来省力很多。

什么时候用 GitHub Flow?

  • 团队规模小(10人以内)
  • 持续部署,每天多次上线
  • 产品迭代快,不需要长期维护多个版本

注意:GitHub Flow 对 CI/CD 的要求很高。如果你没有自动化测试和自动化部署,合并到 main 后手动部署,那风险就大了。我曾经见过一个团队,合并后忘了部署,结果线上还是旧代码,排查了半天才发现问题。

GitLab Flow:环境分支的智慧

GitLab Flow 是 GitLab 团队提出的改进版。它解决了 GitHub Flow 的一个痛点:环境管理

你想想看,GitHub Flow 说「合并到 main 就部署」,但你的环境可能不止一个:开发环境、测试环境、预发布环境、生产环境。难道每次合并都部署到所有环境?显然不合理。

GitLab Flow 的解决方案是:引入环境分支

典型结构

main(开发主线)
  ↓
pre-production(预发布)
  ↓
production(生产)

代码从 feature 分支合并到 main,然后通过 merge request 逐步提升到 pre-production,最后到 production。每个环境分支都对应一个真实的部署环境。

避坑指南:我曾经在预发布环境发现了一个 bug,直接在 pre-production 分支上修了。结果后来合并到 main 时产生了冲突。正确的做法是:在 feature 分支上修,然后重新走一遍合并流程。环境分支只用来「提升」代码,不要在上面直接改。

GitLab Flow 的另一种变体:版本分支

如果你的产品需要同时维护多个版本(比如 v1.0、v2.0),GitLab Flow 也支持。做法是创建 v1.0-stablev2.0-stable 这样的长期分支,bug 修复从 main cherry-pick 到这些分支上。

特性 GitHub Flow GitLab Flow
长期分支数 1个(main) 多个(main + 环境分支)
环境管理 隐式(通过 CI/CD) 显式(通过分支)
版本维护 不擅长 支持
适合场景 持续部署、小团队 多环境、多版本

Forking 工作流:开源项目的标配

说到开源项目,Forking 工作流是绕不开的。你想想看,Linux 内核、Kubernetes、React,这些顶级开源项目,哪个不是用 Forking 工作流?

它的核心思想很简单:贡献者没有主仓库的写权限。你要改代码,先 Fork 一份到自己的账号下,然后在自己的仓库里改,最后通过 Pull Request 把改动提交回去。

流程拆解

  1. Fork 主仓库。在 GitHub 上点一下 Fork 按钮,你的账号下就有了一个副本。
  2. Clone 你的 Fork。注意,clone 的是你的仓库,不是主仓库。
  3. 添加 upstream 远程。这一步很多人会忘。你需要把主仓库的地址添加为 upstream,方便后续同步。
  4. 创建 feature 分支。别在 main 上直接改,养成好习惯。
  5. 提交 PR。从你的 feature 分支,向主仓库的 main 分支发起 PR。
  6. 等待 review。项目维护者会审查你的代码,可能会要求修改。

我踩过的坑:有一次我给一个开源项目提 PR,代码写好了,但主仓库已经往前推进了好几个 commit。我的 PR 产生了冲突。当时我直接在 GitHub 上点了一下「Resolve conflicts」,结果把别人的代码搞乱了。正确的做法是:在本地 rebase 到 upstream/main,解决冲突后再 force push。

Forking 工作流的同步策略

这是 Forking 工作流里最容易出问题的地方。我建议你记住这个命令序列:

# 添加 upstream(只需要做一次)
git remote add upstream https://github.com/原仓库/项目.git

# 同步主仓库的最新代码
git fetch upstream
git checkout main
git rebase upstream/main

# 推送到你的 Fork
git push origin main --force

警告--force 要慎用。如果你和别人协作同一个 Fork,force push 会覆盖别人的提交。个人项目无所谓,团队协作时一定要先沟通。

三种工作流的对比

说了这么多,到底该选哪个?我个人的经验是:

  • 内部小团队,持续部署 → GitHub Flow。简单直接,少即是多。
  • 内部团队,多环境多版本 → GitLab Flow。环境分支让部署流程更清晰。
  • 开源项目,外部贡献者 → Forking 工作流。这是唯一的选择,因为你不能给每个贡献者都开写权限。

嗯,其实还有一种情况:大公司内部的大型项目,可能会把 Forking 工作流用在内部。比如我在上一家公司,每个团队 Fork 一个公共仓库,然后通过内部 PR 协作。这样既保证了代码质量,又避免了权限管理的麻烦。

SVG 流程图:三种工作流的核心逻辑

三种工作流核心逻辑对比 GitHub Flow feature main 部署 PR → 合并 → 立即部署 GitLab Flow feature main pre-prod production 逐步提升:feature → main → pre-prod → prod Forking Workflow 主仓库 Fork 你的 Fork clone 本地仓库 PR Fork → Clone → 修改 → PR → Review 如何选择? 小团队 + 持续部署 → GitHub Flow 多环境 + 多版本 → GitLab Flow 开源项目 + 外部贡献者 → Forking Workflow

最后说一句:工作流是工具,不是教条。我见过用 GitHub Flow 做得很烂的团队,也见过用 Git Flow 做得风生水起的团队。关键不在于选哪个,而在于团队是否理解并遵守规则。选一个适合你们的,然后坚持下去。


公众号:蓝海资料掘金营,微信deep3321