如何在 GitLab merge request 中只查看新改动?
结论
Changes 页面的 Compare 下拉菜单中的“版本”指 merge request 的 diff version,也就是一次 push 后生成的差异快照。GitLab 每次 push 会创建一个新的 diff version;一次 push 即使包含多个 commit,也只生成一个版本。因此,Commit 页面显示两三个 commit,而 Changes 页面只显示一个版本,是正常的。GitLab:Merge request diff versions
通常可以选择之前审查过的 diff version 与最新版本比较,查看两个快照之间的变化。评论时间无法准确标识你审查的是哪个 diff version;如果分支经过 rebase 等历史改写,比较结果也可能重新包含旧改动。GitLab 文档指出,rebase 后的 diff version 比较可能包含被 rebase 的改动,因此结果不一定只反映审查意见带来的新改动。GitLab:Merge request workflow
版本和 commit 的区别
- Commit 是 Git 历史中的一次提交。一次 push 可以推送多个 commit。
- Diff version 是 GitLab 在一次 push 后记录的 merge request 差异版本。它对应一次 push,不对应其中的每个 commit。
- Compare diff versions 用于比较两个 diff version,帮助审查增量。比较结果仍取决于版本对应的分支状态和比较基准。
GitLab 默认将 source branch 的最新状态与 target branch 的最新提交进行比较。如果 target branch 在两次审查之间前进,或 source branch 被 rebase,当前差异的比较基准可能与之前不同。GitLab:Merge request diff versions GitLab:Working with diffs
建议的审查方法
- 在 Changes 页面的 Compare 菜单中,选择你实际审查过的 diff version 和最新版本。不要仅凭最近一次评论的时间推断版本,因为评论时间无法标识 diff version。
- 查看 merge request 的 push 系统备注,确认每次 push 的时间及其包含的 commit,再与 Changes 页面中的版本对应。一次 push 包含多个 commit 时,只会产生一个新的 diff version。
- 如果比较结果再次出现大量旧内容,检查 source branch 是否经过 rebase 或其他历史改写,并确认 target branch 在这段时间内是否更新。发生这些情况时,差异可能不只包含新提交。
- 如果需要核对版本对应的提交,可以使用 GitLab Merge Requests API 的版本端点:
GET /projects/:id/merge_requests/:merge_request_iid/versions
响应会列出 diff versions 及其关联的 SHA 和 commit 信息,可用来确认比较的是哪两个快照。GitLab:Merge requests API
注意事项
如果分支没有被改写,而且比较的是上次审查的版本与最新版本,diff version 比较通常适合查看增量。如果分支经过 rebase,或版本对应关系不清楚,应先核实版本的 SHA 和提交历史,再判断哪些内容是新改动。仅凭差异看起来很大,无法确认其中遗漏或包含了什么;还需要结合具体版本和提交信息核对。
备注:内容仅供参考。
