Closes #42 only closes: what linking a pull request to an issue actually does
Linking a pull request to an issue with a GitHub keyword is a closing mechanism, not a status mechanism, and it is ignored outside the default branch. Three approaches, compared from source.
A pull request has been open for three days. Two people have reviewed it. Its
description says Closes #42, and issue #42 still says exactly what it said on
Monday.
Nothing is broken. The usual way to link a pull request to an issue on GitHub is a closing keyword, and a closing keyword does one thing at one moment. Teams find the gap slowly and go looking for the setting that fixes it. There is no setting. The documentation is worth reading properly once, because it carries three constraints that are rarely stated together, and the third decides whether you need anything beyond GitHub.
What linking a pull request to an issue with a keyword actually does
GitHub supports nine keywords — close, closes, closed, fix, fixes,
fixed, resolve, resolves, resolved
(docs.github.com).
Put one in a pull request description followed by an issue reference and two
things happen: the issue shows the pull request as linked, and on merge the
issue closes. You can also link by hand, up to ten issues per pull request,
from the Development panel in the sidebar.
Constraint one: it only works on the default branch
GitHub states this without ambiguity: "The special keywords in a pull request description are interpreted only when the pull request targets the repository's default branch. If the pull request targets any other branch, then these keywords are ignored, no links are created, and merging the PR has no effect on the issues" (docs.github.com).
Read that again if you run a develop branch, a release branch, or any flow
where feature work merges into an integration branch first. Keyword linking
there is not degraded, it is inert — no link is created at all, so there is not
even a broken one to notice.
Commit messages carry a related trap. Keywords work in them, but "the pull request that contains the commit will not be listed as a linked pull request" — closure without the link (docs.github.com).
Constraint two: nothing reads the branch name
GitHub's mechanism reads a pull request description or a commit message. A
branch named fix/closes-42 links nothing to anything; you can attach a branch
to an issue by hand from the Development panel, but no keyword does it. That
matters because the branch is the first artefact the work produces, days before
there is a description to write a keyword in, so any scheme beginning at the
pull request is blind to the whole first stretch — which is why where the key
sits in a branch name is the load-bearing
decision.
Constraint three: there are only two states
The vocabulary gives it away. All nine keywords mean the same thing. There is
no GitHub keyword for started, in review or waiting on QA, because the
mechanism is bound to the only transition an issue has. In the REST API an
issue's state is open or closed, and state_reason records why it closed —
completed, reopened, not planned, duplicate
(docs.github.com). That is a
vocabulary for endings, not for middles.
So keyword linking cannot express the sentence a small team keeps a board for: a human is waiting on another human. People have asked: a community thread requesting that issues move to In Progress when a pull request is attached went unanswered and was marked dormant after sixty days (github.com).
GitHub has conceded half the point itself. In April 2025 it shipped a repository setting that stops merged pull requests closing their linked issues, on the reasoning that for many teams merging code does not mean the work is done (github.blog). Notice the shape of it: a switch to remove the one transition, not a way to add a second.
Three approaches, side by side
| GitHub keywords | Linear | Kevta | |
|---|---|---|---|
| What creates the link | closing keyword + issue reference, or manual | magic word + issue ID, or the ID in the branch or title | the board key appearing in branch, title or body |
| Where it may appear | PR description, commit message, sidebar | branch name, PR title, description, commit message | branch head ref, PR title, body, commit messages on a push |
| Target branch gates linking | yes, default branch only | no such condition stated | no |
| Words for "related, not closing" | none | nine, including ref, part of, relates to |
closes nothing by itself |
| States it can drive | closed | In Progress on open, Done on merge, plus draft and review states | any status option, from fifteen git triggers |
| What you must remember | the keyword | the magic word, or the ID in the branch | nothing |
The interesting part of Linear's list is not its closing words but the separate
non-closing set — ref, part of, relates to and six more — for a pull
request that touches an issue without finishing it. By default it moves linked
issues to In Progress when pull requests open and Done when they merge
(linear.app). That is a better answer than
nine synonyms for closed, and worth saying plainly.
Where GitHub keywords are still the right answer
They need nothing: no app, no second account, no integration, no board key for
anyone to learn. A drive-by contributor from a fork can write Fixes #91 and
it works, because the mechanism lives in the same system as the code — one
record, nothing to drift.
If your work merges into the default branch, if closed is the only state you need, and if the people writing pull requests are the people reading the issues, you have your answer, and a tracker will cost more than it returns.
What key-in-branch matching does differently
Kevta takes the third column, and its position is that there is no linking step
to forget. Copy a branch name off an issue and you get
feature/MS-42-refactor-router. The matcher scans for the board key followed
by alphanumerics, anchored on a word boundary and matched case-insensitively,
so the key is found wherever it sits and the -slug tail is ignored. The
default rule reads the branch head ref, the title, the body and, on a push, the
commit messages.
Nothing in that matcher looks at what the pull request targets, which is the
practical difference from constraint one: a pull request into develop is
matched like one into main. The key scheme is in the boards
guide, and which git events are worth binding to a
status is a separate question.
Two limits, plainly. If the key appears nowhere, Kevta sees nothing, and there is no Development panel to fall back on: the links on an issue are written by the matcher, not picked by a person. And an outside contributor will not know your board key, which is why open-source repositories stay keyword territory.
Keyword linking is not a weak version of status automation. It is a complete implementation of a smaller thing. If that smaller thing isn't what you needed, Kevta is in beta and we are letting people in from the waitlist.
Disclosure
We build an issue tracker, so the third column of that table is ours. Every claim about GitHub and Linear is quoted from their own docs and linked where made; if any has changed since August 2026, those pages count, not this one.
- github
- issue-tracking
- tooling