这一篇在干嘛?

Git 允许几十种协作方式,但常用的就三种工作流。这一篇把它们讲透,并给出「向别人的项目贡献代码」的标准动作清单——这在开源世界就是日常。对应《Pro Git》第 5 章。

三种常见工作流

1. 集中式工作流

所有人推拉同一个中央仓库的 main。小团队够用,但人一多,push 冲突频率陡增。

2. 集成管理者工作流(GitHub 的标准姿势)

每个贡献者有自己的公开仓库(fork),项目维护者从各处拉取(pull)贡献:

维护者仓库 ◀── pull ── 你的 fork ── push ── 你的本地

一个人(维护者)当唯一网关,历史干净、权限清晰——开源项目几乎都用这个

3. 司令官与副官工作流

超级大项目(如 Linux 内核)的玩法:司令官只收副官的合并,副官各管一摊收开发者的贡献,多级漏斗。了解即可。

私有团队的分支纪律

即使一个小团队用同一个仓库,也建议遵守:

  • main 保持稳定可发布
  • 所有工作在主题分支(feature/fix 分支)上进行;
  • 合并前先拉取最新的 main:git fetch && git rebase origin/main(私有分支可安全 rebase);
  • 合并完就删分支。

写好提交信息:别小看这件事

提交信息是给三个月后的你和所有协作者看的。通用格式:

修复登录页在 iOS 输入法弹起时的布局错位
 
键盘弹起时 window resize 事件未触发重排,导致提交按钮被遮挡。
改为监听 visualViewport resize 并强制重算容器高度。
 
 Fixes #231

要点:

  • 第一行 ≤ 50 字符,概括这次提交干了什么(祈使句:「修复 xxx」而不是「修复了」);
  • 空一行后写正文:为什么这么改、影响范围;
  • 关联 issue(Fixes #231)。

一条提交 = 一个完整、自洽的改动。别把「改 bug」和「重构」塞进同一条提交。

向开源项目贡献:标准动作

没有 push 权限时(绝大多数情况),流程是:

# 1. 在网页上 fork 项目,得到自己的副本
git clone https://github.com/you/project.git
cd project
# 2. 建主题分支——永远不要直接在 main 上改
git checkout -b fix-readme-typo
# 3. 改代码,多次小提交,写清楚每条提交说明
git commit -a -m "docs: fix typo in README installation section"
# 4. 推送到你的 fork,然后在 GitHub 上发起 Pull Request
git push -u origin fix-readme-typo

之后等维护者评审:可能被要求修改——继续在你的分支上提交并 push,PR 会自动更新。

大项目 PR 的隐藏约定

  • 提交前跑一遍项目自带的测试与 lint;
  • 遵循项目的 CONTRIBUTING.md;
  • 如果评审周期较长,rebase 到最新 main 再强推自己的 fork 分支(这是你的私有分支,rebase 合法)。

维护者视角:怎么收别人的贡献

  • 邮件补丁流(Linux 内核等):贡献者用 git format-patch 生成补丁,维护者用 git am 应用。
  • 远程拉取流(GitHub):维护者 git remote add contributor <对方 fork 地址>git fetch 后审查 git diff main...contributor/branch,认可则 merge。
  • 拿不准的大改动:先用主题分支收着,测试通过再并进 main。

小结

  • 三种工作流:集中式(小团队)、集成管理者(开源标配)、司令官(超大型)。
  • 私有协作纪律:main 稳定、主题分支开发、合并前 rebase 到最新。
  • 提交信息 = 标题行 + 空行 + 为什么;一条提交一件事。
  • 开源贡献五步:fork → clone → 分支 → 提交推送 → 发 PR。

学完你会得到:

  • 按团队规模选择工作流的判断力
  • 一套可直接抄的提交信息模板
  • 向任何开源项目提交 PR 的完整流程

自测

下一篇:🐙 GitHub 实战:从 Issue 到 Pull Request