17、团队协作基础:Pull Request(PR)与 Merge Request(MR)的创建、审查、合并流程

聊到团队协作,就绕不开 Pull Request 和 Merge Request。说白了,它们俩是同一件事——只是叫法不同。GitHub 叫 PR,GitLab 叫 MR。我刚开始带团队那会儿,大家还习惯直接往 master 上推代码,结果嘛……你想想看,谁都不敢保证自己写的代码不出问题。

PR/MR 的核心价值,就是给代码加一道「人工审核」的关卡。它不只是流程,更是一种文化。今天我就把这块掰开揉碎了讲清楚。

PR 和 MR 到底是个啥?

Pull Request,字面意思是「拉取请求」。你写好代码,想合到主分支,得先发个请求,让别人看看。Merge Request 同理,只是 GitLab 的命名偏好。

我个人习惯用 GitHub,所以下文统一叫 PR。但你要知道,MR 的流程几乎一模一样。

核心逻辑:PR 不是合并动作,而是「请求合并」的讨论空间。代码合入之前,所有问题都在这里暴露、讨论、修复。

PR 的生命周期:从创建到合并

一个标准的 PR 流程,大概分五步。我画了张图,你先看个全貌。

PR/MR 完整生命周期 ① 创建分支 git checkout -b feat/xxx ② 提交 PR 填写标题+描述 ③ 代码审查 Reviewer 提意见 ④ 修改 & 重新提交 git push 更新分支 ⑤ 合并 & 关闭 Merge / Squash / Rebase ❌ 拒绝 / 关闭 无需合并,直接关闭

第一步:创建分支,写好代码

PR 的前提是分支。你永远不要在 master 或 main 上直接改代码。我见过有人图省事,直接在 master 上改了一行,然后推上去……结果那天整个团队都在等他回滚。

正确的做法是:

# 从最新的主分支拉出功能分支
git checkout main
git pull origin main
git checkout -b feat/user-login-optimization

分支命名要有意义。我个人习惯用 feat/fix/refactor/ 做前缀,后面跟简短描述。这样一看分支名,就知道这 PR 是干嘛的。

第二步:提交 PR,写好描述

代码写完了,commit 也推上去了。这时候在 GitHub 上点「New Pull Request」,选好源分支和目标分支。

嗯,这里要注意——PR 的描述比代码本身更重要。为什么?因为审查者要通过描述来理解你的意图。

我的 PR 模板:

  • 标题:[类型] 简短描述(如:[feat] 优化用户登录流程)
  • 背景:为什么要做这个改动?
  • 改动内容:改了哪些文件,核心逻辑是什么
  • 测试方式:怎么验证这个改动是正确的
  • 关联 Issue:Closes #123

我曾经见过一个 PR,标题就写「fix bug」,描述是空的。你想想看,审查者得花多少时间去猜你到底改了啥?

第三步:代码审查(Code Review)

这是 PR 流程的灵魂。审查者会逐行看你的代码,提意见、问问题。你可能会觉得烦,但换个角度想——有人帮你免费找 bug,多好的事。

审查时我一般关注这几点:

审查维度 具体问题
逻辑正确性 代码能实现预期功能吗?有没有边界情况没处理?
代码风格 符合团队规范吗?命名是否清晰?
安全性 有没有 SQL 注入、XSS 等风险?
性能 有没有不必要的循环、重复查询?
可维护性 三个月后别人能看懂这段代码吗?

避坑指南:我曾经因为没检查 PR 中的数据库查询,上线后导致慢查询把数据库拖垮了。从那以后,我审查代码时一定会看 SQL 执行计划。你也别忽略这个环节。

第四步:修改与重新提交

审查者提了意见,你怎么办?别急着怼回去。先想想对方的建议有没有道理。

修改完成后,直接 push 到同一个分支。PR 会自动更新,审查者能看到新的 commit。不需要重新创建 PR。

# 在本地修改代码
git add .
git commit -m "fix: 根据 review 意见优化查询逻辑"
git push origin feat/user-login-optimization

这里有个小技巧:如果修改比较多,可以在 PR 评论区 @ 审查者,说一句「已修改,麻烦再看一下」。这样对方会收到通知,不会晾着你的 PR 不管。

第五步:合并与关闭

审查通过了,CI 也绿了,这时候就可以合并了。GitHub 和 GitLab 都提供了几种合并方式:

  • Create a merge commit:保留所有 commit 历史,适合记录完整开发过程
  • Squash and merge:把所有 commit 压缩成一个,保持主分支历史干净
  • Rebase and merge:将 commit 变基到目标分支顶部,历史呈线性

我个人偏好 Squash and merge。为什么?因为开发过程中的「fix typo」「wip」「test」这些 commit 没有保留价值。合并后主分支上只看到一个清晰的 commit,多舒服。

合并后别忘了:删除远程分支。GitHub 上合并 PR 时有个「Delete branch」按钮,点一下。分支留着只会让列表越来越乱。

PR 审查中的常见问题

我带过不少团队,发现 PR 流程中容易踩几个坑:

  • PR 太大:一个 PR 改了几十个文件,审查者看到就头疼。我建议一个 PR 控制在 200 行以内,专注一件事。
  • 审查流于形式:有人点个「Approved」连代码都没看。这比不审查更可怕。
  • 长时间不处理:PR 挂了一周没人管。团队应该约定:24 小时内必须给出初步反馈。

说白了,PR 流程好不好用,不取决于工具,取决于人。工具只是辅助,真正的价值在于团队形成了「互相 review、共同进步」的文化。

好了,PR 和 MR 的核心流程就这些。你动手创建一个试试,走一遍流程,比看十遍文章都管用。


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