GitLab がマージリクエストを作らなかった理由
API でマージリクエストを作ると(POST /projects/:id/merge_requests に source_branch・target_branch・title)、409・422・400・403 で断られることがあり、GitLab の API の文書にはそれぞれの意味が書いてありません。以下はすべて GitLab のソース(lib/api/merge_requests.rb、lib/api/helpers/merge_requests_helpers.rb の handle_merge_request_errors!、app/models/merge_request.rb の検査と MergeRequests::CreateService)を 2026年10月24日に読んで確かめたものです。
答えの意味
- 409
{"message":["Another open merge request already exists for this source branch: !42"]}(和訳:このソースブランチの開いているマージリクエストがもうあります):同じプロジェクトの同じブランチから同じ対象のブランチへのマージリクエストが、まだ開いています。コロンの後がその番号です。下書き(Draft)も開いているので数に入ります。閉じたものやマージ済みのものは入りません。同じブランチから別の対象のブランチへなら作れます。 - 422
{"message":["You can't use same project/branch for source and target"]}(和訳:ソースと対象に同じプロジェクト・ブランチは使えません):ソースと対象が、同じプロジェクトの同じブランチです。 - 400
{"message":{"source_branch":["does not exist"]}}(target_branchのことも。和訳:ありません):プロジェクトにその名前のブランチがありません。たいていはまだ push していないか、名前の大文字小文字や綴りが違います。 - 400
{"message":{"source_branch":["is invalid"]}}(和訳:正しくありません):GitLab がその名前をマージリクエストのブランチとして受け付けません。 - 403
{"message":"403 Forbidden"}:あなたのアカウントは、このプロジェクトから、または対象のプロジェクト(フォークから作るときのtarget_project_id)へ、マージリクエストを作れません。GitLab の権限の一覧では、マージリクエストの作成は Developer の役割から上です。外のメンバーからの貢献を受け付けるプロジェクトでは、その人たちも自分のマージリクエストを作れる、とも書いてあります。 - 422
Source project is not a fork of the target project(和訳:ソースのプロジェクトは対象のプロジェクトのフォークではありません):target_project_idが、ソースのプロジェクトのフォークのつながりの外のプロジェクトを指しています。
api の権限が無いトークンも 403 で断られますが、そのときの答えには insufficient_scope と書いてあります。足す権限の見つけ方へ。無いプロジェクトや見えないプロジェクトのパスは 404 です。住所か権限かへ。
いまどうなっているか
curl -H "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/projects/group%2Fproject/merge_requests?state=opened&source_branch=feature&target_branch=main"
feature から main への開いているマージリクエストの一覧です。409 が名指ししたものはこの中にあります。GitLab にブランチがあるかは、…/projects/group%2Fproject/repository/branches/feature が無ければ 404 で答えます。gitlab.com はあなたのサーバーの住所に置き換えてください。
直し方
- 409:名指しされたマージリクエストを開いて、そこで続ける。ブランチに push すればそのマージリクエストが更新されます。新しく作りたいなら、先に古い方を閉じるか、別の対象のブランチを選ぶ。
- 422「same project/branch」:別の対象のブランチ(たいていは既定のブランチ)を選ぶ。
- 400「does not exist」:ブランチを push してから(
git push -u origin feature)作る。両方のブランチの名前の綴りを確かめる。 - 403:メンテナーに Developer の役割を頼むか、プロジェクトをフォークして、フォークからマージリクエストを作る。
IntelliJ IDEA の「Failed to create merge request」「No changes between …」「Unable to create merge request from … to …」「Commits will be pushed to a protected branch」
IntelliJ IDEA に入っている GitLab の機能の New Merge Request のタブは、作る前に2つのブランチを確かめ、それから上と同じ POST /projects/:id/merge_requests を送ります。ソース(2026年10月30日に確認・IntelliJ IDEA:GitLabMergeRequestCreateViewModel.kt・GitLabMergeRequestCreateStatusComponentFactory.kt・GitLabMergeRequestsApi.kt・GitSharedSettings.java)では:
- 「Failed to create merge request」(マージリクエストを作れなかった)は、GitLab が断ったとき、理由を問わず出ます。Details で文が見えるので、上の答え(409・422・400・403)がそのまま当てはまります。
- 「Merge Request already exists」(もうある)と View は、同じプロジェクトの同じブランチから同じ行き先のブランチへの、開いているマージリクエストがすでにあるとき:GitLab なら 409 で断る場合です。
- 下の3つの確かめは1度に1行だけ、この順で出ます。どれも GitLab には問い合わせません。
- 「Unable to create merge request from main to origin/main」(main から origin/main へは作れない)は、マージしようとしているブランチが、行き先のブランチを追いかけている同じ名前の手元のブランチのとき:コミットが手元の行き先のブランチに乗っています。そこから新しいブランチを作り、そのブランチから作ります。
- 「No changes between 'origin/main' and 'feature'」(違いが無い)は、元のブランチに、行き先のブランチに無いコミットが1つも無いとき。IntelliJ IDEA はこれを手元のリポジトリで数える(
git log origin/main..feature)ので、最後に fetch した時点の答えです。 - 「Commits will be pushed to a protected branch」(保護されたブランチに push される)は、元のブランチの名前が IntelliJ IDEA 自身の Git の設定 Protected branches(Settings | Version Control | Git・既定は
masterとmain・Load branch protection rules from GitHub がオンなら GitHub の決まりも足される)に当たるとき。GitLab の保護ブランチのことではありません。
IntelliJ IDEA で GitLab のマージリクエストを見るなら
Lesstep の Merge Request Inbox for GitLab は、JetBrains IDE(2024.1 以降)のプラグインです。いまいるブランチからマージリクエストを作ります。GitLab にまだそのブランチが無いときは先に push するよう勧め、同じブランチを対象には受け付けず、GitLab が 409 で答えたときは、このブランチのマージリクエストがもう開いていると、番号の入った GitLab の文を添えて伝えます。403 なら、プロジェクトでの役割か設定があなたのアカウントに許していない可能性がある、と。ほかの断りは GitLab の文で伝えます。見るのは無料、作成・承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitLab のマージの断り(405・409・422) · GitLab の承認の断り(401・409) · GitLab のコメント・スレッドの断り(400・403) · GitLab の「insufficient_scope」 · GitLab の 401「invalid_token」 · GitLab の 404「Project Not Found」 · GitLab のリベースの断り・失敗(403・409) · GitLab の MR の一覧の断り(400・404) · GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · English