Lesstep
GitLab・マージリクエスト・マージの API・2026年10月24日に確認

GitLab がマージを断った理由

API でのマージが失敗すると、GitLab は5つのどれかで答え、それぞれ意味が違います。GitLab のマージの API の説明を、ソース(lib/api/merge_requests.rb)と突き合わせました。405 はいまマージの条件のどれかで止まっている、409 は元のブランチが動いた、422 はマージそのものが失敗した、401 はアカウントが対象のブランチへマージできない、400 はグループかインスタンスがコミットの SHA を求めている、です。

答えの一覧

どの条件で止まっているか(405)

マージリクエストを読んで detailed_merge_status を見ます:

curl -H "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/projects/group%2Fproject/merge_requests/42"

主な値です(GitLab のマージの状態の一覧より):

一覧には、ステータスチェック・セキュリティポリシー・ロックされたファイルやパス・必須の Jira の課題・タイトルの形式の値もあります。自動マージ(auto_merge)を頼めば、条件が満たされたときにマージされます。自動マージにも別の 405 があります。自動マージが待つものへ。

直し方

IntelliJ IDEA の「Review has conversations that must be resolved」と「Source branch must be rebased before merging」

IntelliJ IDEA に入っている GitLab のマージリクエストの機能は、マージリクエストの状態にこの2つの行を出します。ソース(2026年10月30日に確認)では:

IntelliJ IDEA の「All required checks have passed」「Checks in progress…」「Checks failed」

IntelliJ IDEA に入っている GitLab のマージリクエストの機能は、マージリクエストの状態にパイプラインの行も1つ、ジョブの一覧を開く Details… のリンクと一緒に出します。ソース(2026年10月30日に確認)では、この行はマージリクエストの最新のパイプライン(head pipeline)のジョブ(1,000件まで)を読み、失敗してよいジョブ(allowFailure)でなければ必須のジョブとして数えます:

IntelliJ IDEA の「Branch has conflicts that must be resolved」

IntelliJ IDEA に入っている GitLab のマージリクエストの機能は、マージリクエストの状態に「Branch has conflicts that must be resolved」(解決が要る衝突がある)の行も、Resolve のリンクと一緒に出します。ソース(2026年10月30日に確認)では、この行は GraphQL のマージの状態(mergeStatusEnum)に従います。CANNOT_BE_MERGED(ソースブランチとターゲットブランチに衝突がある)でこの行が出て、CHECKING・UNCHECKED・CANNOT_BE_MERGED_RECHECK(まだ確かめていない・前の状態は CANNOT_BE_MERGED)と、詳しい情報を読み込む前は、代わりに「Checking branch for conflicts」(衝突を確かめ中)が出ます。CAN_BE_MERGED では出ません(GitLab の説明「MergeStatus」・IntelliJ IDEA:GitLabResolveConflictsLocallyViewModel.kt・GitLabMergeRequestFullDetails.kt・GitLabMergeRequestDetailsStatusChecksComponentFactory.kt・CodeReviewDetailsStatusComponentFactory.kt)。Resolve を押すと、リベースかマージかを聞いて、ターゲットブランチを fetch し、ソースブランチをチェックアウトして(ソースのプロジェクトがフォークで、手元のクローンにまだそのリモートが無ければ足して)、手元のクローンで、ソースブランチをターゲットブランチの上にリベースするか、ターゲットブランチをソースブランチにマージします。衝突は IDE の中で解き、マージリクエストが変わるのは push したときだけです。リベースした後の push は強制 push になります(ResolveConflictsLocallyViewModel.kt)。Resolve は、リポジトリがマージやリベースの途中のとき(「Merge is already in progress」)、GitLab がソースのプロジェクトを返さないとき(「The source project is private or does not exist」)、今のブランチがすでにソースブランチを追っていて、GitLab が差分の基点として返すコミット(diffRefs の baseSha・「Merge base of the branch the comment was made on」)がその履歴にあるとき(「Already resolved locally, push your changes to resolve」)は、理由を添えて押せなくなります(CollaborationToolsBundle.properties・GitLabBundle.properties・GitLabResolveConflictsLocallyViewModel.kt)。

IntelliJ IDEA で GitLab のマージリクエストを見るなら

Lesstep の Merge Request Inbox for GitLab は、JetBrains IDE(2024.1 以降)のプラグインです。マージの前に、マージリクエストのマージの条件を見せます。承認・変更の依頼・未解決のスレッド・パイプライン・競合と、detailed_merge_status が言う GitLab のほかの理由を、マージを止めているものから順に並べます。マージするのは、画面に出ていた先頭のコミットです。GitLab が断ったときは、どの場合かを言います。405 なら今はマージできないのでマージの条件を見るように、409 なら元のブランチが変わったので読み直すように、422 なら GitLab がマージできなかったと GitLab の文を添えて、401 なら役割かプロジェクトの設定が許していないかもしれない、と。リベースが要るときは、リベースを勧めます。読むのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。

GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:GitLab の自動マージの断り(405)・取り消し · GitLab の 404「Project Not Found」 · GitLab の「insufficient_scope」 · GitLab の 401「invalid_token」 · GitLab の承認の断り(401・409) · GitLab のコメント・スレッドの断り(400・403) · GitLab のマージリクエストが作れない(409・422・400) · GitLab のリベースの断り・失敗(403・409) · GitLab の MR の一覧の断り(400・404) · GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab のスカッシュでマージが断られる・失敗する · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · English