GitHub:ブランチがマージキューでマージする
リポジトリの管理者は、ブランチにマージキューを必須にできます。ブランチの保護なら「Require merge queue」、ルールセットなら規則 merge_queue(「Merges must be performed via a merge queue」)です。そうすると、そのブランチへのプルリクは直接にはマージされません。ブランチの保護の必須の確認をすべて通ったら、リポジトリの書き込み権限を持つ人がキューに入れます。キューは、対象のブランチの最新の版と、すでに並んでいるプルリクにそのプルリクの変更を重ねた結果で、必須のステータスチェックが通ることを確かめ、それから GitHub がキューに設定された方法でマージします(GitHub の説明「マージキューを管理する」と「マージキューでプルリクをマージする」)。プルリクのベースブランチにマージキューがあるかは GraphQL の isMergeQueueEnabled で、キューのどこにいるかは mergeQueueEntry で分かります(2026年10月26日に確認)。
POST /graphql pullRequest(number: N) { isMergeQueueEnabled isInMergeQueue mergeQueueEntry { position state } }
POST /graphql enqueuePullRequest(input: { pullRequestId: ID, expectedHeadOid: SHA }) { mergeQueueEntry { position } }
PUT /repos/OWNER/REPO/pulls/N/merge-async { "merge_action": "merge_queue", "sha": SHA }
直接マージされない理由
- REST のマージ:「Merge a pull request」(
PUT /repos/OWNER/REPO/pulls/N/merge)は、マージキューでのマージに対応していません。GitHub は代わりに非同期のマージの API を勧めています(GitHub の説明「プルリクの REST API」)。 - 非同期のマージ:
PUT …/merge-asyncは、裏でマージするか、プルリクをマージキューに入れます。merge_actionは、defaultなら対象のブランチにマージキューがあればそれを使い、merge_queueならキューに入れ、direct_mergeならキューを通さずにマージします。202 は受け付けて裏で進めるという意味です。すでにマージ済みか、すでにキューにいるなら 200 がすぐに返り、「enqueued」はキューに入ったという意味で、マージされたという意味ではありません。400 はマージできない(閉じている・下書きのまま)という意味で、この段階ではプルリクの基本的な状態しか確かめず、ブランチの保護やリポジトリのルールは走りません。409 は、そのプルリクにほかのマージの依頼がもう待っているという意味です。コミットのタイトル・メッセージ・merge_methodは、直接のマージにだけ効きます。 - GraphQL:
enqueuePullRequestは、すぐに入れられる時だけプルリクをキューに入れます。入れられない時は、理由を説明するエラーを返します。expectedHeadOidは想定している head、jumpはキューの先頭に入れる指定です。dequeuePullRequestはキューから外します。 - GitHub の画面で:「Merge when ready」がプルリクをキューに入れます。条件を全部満たす前に押すと自動マージが有効になり、条件を満たした時にキューに入ります(リポジトリで「Allow auto-merge」が無効でも)。管理者は、ブランチの保護の設定が許していれば「Merge without waiting for requirements to be met (bypass branch protections)」で直接マージできます。
キューがすること
- マージグループ:キューは、プルリクの変更をベースブランチの最新の版と前に並んだプルリクと合わせて、決まった接頭辞の一時的なブランチに置き、種類
checks_requestedのmerge_groupイベントを送り、ベースブランチが求めるチェックが通ったらマージします。マージは並んだ順(先に入った物から)です。 - チェックはマージグループで走らせる:必須のチェックを報告する GitHub Actions のワークフローには、
pull_requestやpushとは別に、merge_groupのイベントが要ります。無いとチェックが報告されず、マージは失敗します(必須チェックが Expected のまま)。ほかの CI は、gh-readonly-queue/{base_branch}で始まるブランチへの push で走らせます。その SHA はプルリクの物と違います。 - 設定:マージの方法、同時に作るビルドの数(
merge_groupの webhook を1〜100)、失敗していないプルリクだけをマージするか(ルールセットのgrouping_strategy:ALLGREEN はグループの各プルリクのマージコミットがすべて通る必要があり、HEADGREEN はグループの先頭だけ)、ステータスチェックの待ち時間(過ぎると報告の無いチェックは失敗とみなされます)、グループの最小・最大の数と待ち時間です。ブランチ名のパターンに*を使うブランチの保護では、マージキューを有効にできません。 - 今いる所:GraphQL は並びの
position・state(QUEUED・AWAITING_CHECKS・MERGEABLE・UNMERGEABLE・LOCKED)・estimatedTimeToMergeを返します。GitHub の画面では、Branches のページと、プルリクのタイムラインの一番下の merge queue のリンクからキューを見られます。先頭へ割り込むと、進行中のプルリクがすべてビルドし直しになります。
キューから外れた理由
- GitHub が挙げる理由:CI がマージグループのテストの失敗を報告した。CI の成功を待つうちに時間切れになった。だれかが API かマージキューの画面で外した。自動では解決できないブランチの保護の失敗があった。最新の対象のブランチと前の変更に重ねたら、必須のステータスチェックが失敗したか、ベースブランチと衝突した。
- 理由はタイムラインに:外された理由は、プルリクのタイムラインに出ます。後ろに並んでいたプルリクは、その変更を除いてまとめ直されます。
直す所
- キューに入れる:直接のマージの API ではなく、GitHub の画面の Merge when ready、
enqueuePullRequest、merge_actionをmerge_queueにしたmerge-asyncのどれかを使います。 - 先にブランチのルールを満たす:キューに入る前に満たす必要があります。承認のレビュー(コードオーナーのレビュー)、会話の解決(マージが会話の解決を待っている)、署名されたコミット(署名の無いコミット)、必須のチェックです。
- チェックをマージグループで走らせる:必須のチェックを報告するワークフローに
merge_groupを足すか、CI をgh-readonly-queue/のブランチで走らせます。 - 外されたら:タイムラインの理由を読んで直し、もう一度キューに入れます。
IntelliJ IDEA で GitHub のプルリクを見るなら
Lesstep の Pull Request Inbox for GitHub は、JetBrains IDE(2024.1 以降)のプラグインです。プルリクのレビュー・チェック・会話を差分の隣に出し、対象のブランチが許す方法でマージします。GitHub がプルリクを blocked と言うときは、マージの確認に読める物を名指しします(報告の無い必須チェック・まだ要るレビュー・ルールが止めている未解決の会話と署名の無いコミット)。対象のブランチがマージキューでマージするなら、「マージ」はプルリクをキューに入れ(GraphQL の enqueuePullRequest)、マージの確認には、キューでマージするブランチであることか、キューの何番目にいて、チェックを待っているのか・マージできるのか・できないのかを出します。受信箱・差分・会話は無料、承認・コメント・解決・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GitHub は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitHub のマージの断り(405・409) · GitHub のレビューの断り(422) · GitHub の検索の 422「Validation Failed」 · 「Resource not accessible by personal access token」 · 401「Bad credentials」 · 「Resource protected by organization SAML enforcement」 · 「API rate limit exceeded」 · GitHub の差分の 406「too_large」・3,000件 · GitHub の行のコメントの 422「must be part of the diff」 · GitHub のブランチの更新の断り(422) · GitHub のプルリクが作れない(422・403) · GitHub の自動マージの断り · GitHub の下書き・レビュー準備完了・閉じるの断り · GitHub の会話の解決の断り · GitHub のチェックが出ない(check runs の 403) · GitHub のファイルの中身が読めない · GitHub の比較の断り(404・422) · GitHub のコメント・返信の断り(ロック・アーカイブの 403) · GitHub のマージの方法の断り(405) · GitHub のブランチが見つからない(404・301) · GitHub Enterprise Server につながらない · GitHub のレビューの依頼が出ない · GitHub のプルリクの一覧が足りない · GitHub の 404・名前を変えたリポジトリ(301・307) · GitHub の行のコメントが outdated・差分に無い · GitHub のプルリクの更新・通知が遅い · GitHub の変更の提案が適用できない · GitHub の必須チェックが Expected のまま · GitHub でコードオーナーのレビューが要る · GitHub で未解決の会話がマージを止める · GitHub で署名の無いコミットがマージを止める · GitHub でマージが最後の push の承認を待っている · GitHub でマージがコードスキャンの結果を待っている · GitHub でマージがコード品質の結果を待っている · GitHub でコードのカバレッジの水準がマージを止める · GitHub でライセンスの適合の結果がマージを止める · GitHub でブランチのロックや更新の制限がマージを止める · GitHub でマージの後にブランチが消えない · GitHub でチームの承認(Required reviewers)がマージを止める · GitHub でシークレットスキャンのアラートがマージを止める · GitHub でスタックしたプルリクがマージできない · GitHub で push の規則が push を止める · GitHub でコミットのメタデータの規則がマージを止める · GitHub で強制 push が止められる · GitHub でプルリクをマージしても issue が閉じない · GitHub のプルリクを手元にチェックアウトできない · GitHub のプルリクがマージ先と衝突している · GitHub で変更を依頼された・レビューを取り消す · GitHub で共同作者がコミットに数えられない · GitHub で依存関係のレビューのチェックが失敗する · GitHub で Dependabot がプルリクをリベースしない · GitHub でフォークが同期できない · GitHub でプルリクのベースのブランチを変えられない · GitHub でプルリクを取り消せない · GitHub でプルリクのテンプレートが出ない · GitHub でプルリクにラベルや担当者が付かない · GitHub でプルリクを閉じられない・開き直せない · GitHub でプッシュ保護にプッシュを止められた · GitHub でプルリクのコメントが隠された · GitHub でデプロイが成功するまでプルリクをマージできない · GitHub でチームに頼んだレビューがメンバーに置き換わった · GitHub でプルリクのファイルの Viewed が外れた · GitHub でマージしていないプルリクがマージ済みになった · GitHub で Copilot のレビューが承認に数えられない · GitHub でワークフローが作ったプルリクのチェックが動かない · GitHub でプルリクに Update branch のボタンが出ない · GitHub で Dependabot のプルリクのチェックが失敗する · GitHub でフォークからのプルリクのチェックが失敗する · GitHub でコミットメッセージの [skip ci] でチェックが動かない · GitHub で保存期間を過ぎてチェックが消えた · GitHub の公開リポジトリのコードレビューの制限 · GitHub でリポジトリのプルリクがオフ・制限されている · GitHub でスタックのプルリクごとにチェックが走る · GitHub でスカッシュでマージ済みのコミットが次のプルリクに出る · GitHub のプルリクでファイルの差分が出ない · GitHub でフォークのプルリクのブランチに push できない · GitHub のプルリクのチェックが取り消された · GitHub で Rebase and merge が使えない · GitHub のマージのコミットメッセージが思った形にならない · GitHub のプルリクでファイルの全行が変わったと出る · GitHub の API がタイムアウトした · GitHub のプルリクで画像や文書の差分が見た目で出ない · GitHub のレビューの依頼が断られる(422) · GitHub で Copilot が作ったプルリクのチェックが動かない・承認が数えられない · GitHub の push が GH006・GH013 で断られる · GitHub で承認が足りずマージできない・数に入らない承認 · JetBrains の IDE で GitHub のプルリクを扱う · English