这篇讲怎么让问题和拉取请求连上,并在合并后自动关闭问题。看完你可以在拉取请求的标题或描述里写 Closes #编号,刷新后确认两边页面互相列出对方;关键字要用英文,写在评论里或只写 #编号 不会生效。
下文用线上仓库 xlliu/test-pr-example。问题 #4 标题是「折扣示例没有说明空购物车」,类型是 功能。拉取请求 #9 从 feature/link-empty-cart 合向 main,描述里写了 Closes #4。两条都还开着,页面上是合并前的样子。
1. 先认清编号
AngusGit 界面上把 Issue 叫作 问题,侧栏里的入口和仓库代码页的页签都叫这个名字。
问题按仓库单独编号,从 #1 开始递增。拉取请求也按仓库单独编号,两套编号互不相干,所以同一个仓库里可以同时有问题 #1 和拉取请求 #1。下文写的 Closes #4,指的都是 问题 的编号,不是拉取请求 #4。
2. 建一条问题,记下编号
已经有问题的话,打开它,记下标题旁边的编号,跳到第 3 节。
- 打开新建表单 侧栏点 问题,在右上角点 新建问题。页面标题是 创建新问题。
- 填写 仓库 选
xlliu/test-pr-example。类型 选 Bug、功能、问题 或 增强 中的一个,创建后不能修改。这条示例选的是 功能,标题是「折扣示例没有说明空购物车」。描述 写清缺了什么。标签、指派人可以先不填。 - 创建 点 创建问题,提示 问题创建成功。打开这条问题,标题旁边的
#加数字就是它的编号。这条示例是#4。
3. 在拉取请求里写上关键字
修好代码、推到一个新分支之后,按平常的方式发起拉取请求。在 标题 或 描述 里,写上关键字加问题编号:
docs: 说明空购物车不计算折扣 Closes #4 #9 的描述就是这两行。关键字和编号之间要有一个空格。下面九个关键字都可以,大小写不限,效果完全一样:
| 词根 | 可用的英文写法 | 示例 |
|---|---|---|
| close | close、closes、closed | Closes #4 |
| fix | fix、fixes、fixed | Fixes #4 |
| resolve | resolve、resolves、resolved | Resolves #4 |
一次关闭多个问题时,每个编号前面都要写关键字,例如 Fixes #4, fixes #5。写成 Fixes #4, #5 的话,只有 #4 会被关闭。#5 在这里只说明写法,这个仓库里没有问题 #5。
写在不同地方,效果不一样:
| 写在哪里 | 两边页面会互相列出 | 合并后自动关闭 |
|---|---|---|
| 拉取请求的标题或描述 | 会 | 会 |
| 拉取请求里某个提交的提交说明 | 不会 | 会 |
| 拉取请求或问题下面的评论 | 不会 | 不会 |
只写 #4,前面没有关键字 | 不会 | 不会 |
| 中文「关闭 #4」「修复 #4」 | 不会 | 不会 |
写成 owner/other-repo#4 这种带仓库名的引用 | 不会 | 不会 |
最稳的做法是写在拉取请求的描述里:合并前就能在页面上确认两边已经连上,不用等到合并那一刻才知道。
4. 合并之前,确认两边已经连上
关联是页面打开时根据标题和描述实时算出来的,保存描述之后刷新页面就能看到。
拉取请求页 会出现 关联的 Issue 一栏,列出 #4 和它的标题,旁边标着 合并后将关闭。
问题页 会出现 关联的 Pull Request 一栏,列出这条拉取请求,状态是 打开。
两边都没出现时,回到描述里检查关键字是不是拼对了、和 # 之间有没有空格、编号是不是这个仓库的问题。把描述里的关键字删掉,关联也会随之消失,不用另外解除。
5. 合并之后,问题自动关闭
拉取请求满足合并条件后,点 合并拉取请求。确认框里会多出一行 合并该 PR 后将自动关闭以下 1 个 Issue:,下面列着 #4。点 确认合并。
这条示例没有合并,所以问题 #4 和拉取请求 #9 现在都还是 打开。合并完成后打开问题 #4,页面会变成:
- 状态变成 已关闭,关闭原因是 已完成。
- 时间线里多出一条「某某 关闭了此问题」,「某某」是点合并的那个人。
- 关联的 Pull Request 里,那条请求的状态变成 已合并。
有两点要提前知道:
- 合并到任何分支都会关闭。 拉取请求的目标分支是
release之类的非默认分支时,合并后问题同样会被关闭。如果你希望代码进了main才算修好,就只在合进main的那条拉取请求里写关键字。 - 合并的人不需要有关闭问题的权限。 能合并这条拉取请求,就能通过它关闭问题。
6. 没有自动关闭时
| 你看到的 | 原因 | 怎么处理 |
|---|---|---|
| 拉取请求页没有 关联的 Issue 这一栏 | 标题和描述里没有能识别的关键字,例如只写了 #4、写了中文「关闭」,或者关键字和 # 连在一起 | 改成 Closes #4 这样的写法,保存后刷新页面 |
| 关键字写在提交说明里,合并前页面上看不到关联 | 提交说明只在合并时检查,页面上的关联只看标题和描述 | 这是正常的,合并后照样会关闭。想提前确认,就把关键字也写进描述 |
| 合并了,问题仍然 打开 | 关键字写在了评论里;写的是另一个仓库的问题;或者代码是直接推送到分支的,没有经过拉取请求 | 只有通过拉取请求合并,并且关键字写在标题、描述或提交说明里,才会自动关闭。需要的话在问题页手动 关闭 |
| 一次写了多个编号,只关了第一个 | 写成了 Fixes #4, #5,第二个编号前面没有关键字 | 每个编号前都写关键字。漏关的那个手动关闭 |
| 问题被提前关掉了 | 关键字写在了合进非默认分支的拉取请求里 | 在问题页点 重新打开,以后只在合进 main 的那条请求里写关键字 |
常见问题
有没有手动把问题和拉取请求连起来的按钮?
没有。关联完全由拉取请求标题和描述里的关键字决定。要建立关联就写上关键字,要解除就删掉它。
只想在拉取请求里提一下某个问题,不想合并后关掉它,怎么写?
不要用关键字,写成「相关问题:#4」这样的普通文字即可。它不会出现在关联列表里,合并后也不会关闭问题。
问题自动关错了,怎么恢复?
打开问题,点 重新打开。状态回到 打开,原来的评论和时间线都还在。
直接推送到 main 的提交里写 Fixes #4,会关闭问题吗?
不会。自动关闭只在拉取请求合并时发生。直接推送的提交不会触发。
手动关闭问题时可以选原因吗?
可以。在问题页点 关闭,在 请选择关闭原因 里选 已完成 或 不计划实施,再点 确认关闭。自动关闭的原因固定是 已完成。
小结
让问题和拉取请求连上,只需要在拉取请求的标题或描述里写一句英文关键字加编号,例如 Closes #4。写好之后先刷新页面,确认拉取请求页的 关联的 Issue 里标着 合并后将关闭。合并之后,问题自动关闭,原因记为 已完成,时间线写明是谁合并的。中文关键字、只写编号、写在评论里,或者直接推送代码,都不会触发关联和自动关闭。
结论: 在拉取请求的标题或描述里写
Closes #编号(或Fixes #编号、Resolves #编号),两边页面就会互相列出关联,并在拉取请求合并后自动把问题置为 已关闭(已完成)。




