GitLab がリベースしなかった理由
API でマージリクエストをリベースすると(PUT /projects/:id/merge_requests/:merge_request_iid/rebase)、その場で 403・409 で断られるか、202 で答えます。202 は GitLab がリベースを順番待ちに入れたという意味だけで、リベースはその後に走り、そこで失敗することもあります。以下はすべて GitLab のソース(lib/api/merge_requests.rb のリベースの窓口、MergeRequests::RebaseService、app/models/merge_request.rb の rebase_async)を 2026年10月24日に読んで確かめたものです。
答えの意味
- 403
{"message":"403 Forbidden - Cannot push to source branch"}(和訳:元のブランチに push できません):あなたのアカウントは、元のブランチがあるプロジェクト(フォークからのマージリクエストならフォーク)で、そのブランチに push できません。リベースはそのブランチを書き換えるので、GitLab は push と同じ権利を求めます。 - 403
403 Forbidden - Source branch is protected from force push(和訳:元のブランチは強制 push から保護されています):元のブランチが保護されていて、その保護が強制 push を許していません。リベースはブランチのコミットを置き換えるので、強制 push にあたります。 - 403
403 Forbidden - Source branch does not exist(和訳:元のブランチがありません):元のブランチが消されています。GitLab の API の文書はこれの理由も「push する権限が無い」としていますが、ソースが見ているのはブランチがあるかどうかだけです。 - 409
{"message":"409 Conflict: Resource lock"}(和訳:使用中です):マージリクエストが開いていない(閉じた・マージ済み・ロック中)か、そのリベースがもう順番待ちか実行中です。この答えは API の文書にありません。 - 409
Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later.(和訳:リベースを順番待ちに入れられませんでした。後でやり直してください):GitLab が約5秒のうちにマージリクエストを押さえられませんでした。
202({"rebase_in_progress":true})の後に失敗したリベースは、その理由をマージリクエストの merge_error に残します。
Rebase failed: Rebase locally, resolve all conflicts, then push the branch.(和訳:リベースに失敗しました。手元でリベースし、衝突をすべて解消してから push してください):元のブランチのコミットが、マージ先のブランチの上にきれいに乗りません。GitLab は、理由を説明しない失敗にもこの文を使います。The rebase pre-receive hook failed: ….(和訳:リベースの pre-receive フックが失敗しました):push を受け付ける前の検査(pre-receive)が、リベースしたコミットを断りました。残りの文はその検査のものです。Rebase failed: ….に Git の文が続くもの:Git そのものが止まりました。Source branch does not exist:順番待ちに入った後で、ブランチが消されました。
GitLab は、失敗したマージの理由もここに書きます。merge_error は、元のブランチに次に push されるか、マージリクエストが閉じられるかマージされるまで残ります。
api の権限が無いトークンも 403 で断られますが、そのときの答えには insufficient_scope と書いてあります。足す権限の見つけ方へ。無いプロジェクトや見えないプロジェクトのパスは 404 です。住所か権限かへ。
いまどうなっているか
curl -H "PRIVATE-TOKEN: your-token" "https://gitlab.com/api/v4/projects/group%2Fproject/merge_requests/42?include_rebase_in_progress=true"
rebase_in_progress が true のあいだは、リベースはまだ順番待ちか実行中です。false になったら、merge_error がリベースが通れば null、失敗したならその理由です。state で、マージリクエストがまだ開いているかが分かります。gitlab.com はあなたのサーバーの住所に置き換えてください。
直し方
- 403「Cannot push to source branch」:メンテナーに Developer の役割を頼むか、ブランチが保護されているなら、あなたの役割がそこへ push できるようにしてもらう。フォークからのマージリクエストなら、作った人にリベースを頼むか、Allow commits from members who can merge to the target branch(マージ先のブランチにマージできるメンバーのコミットを許す)を選んでもらう。GitLab の文書では、これは公開されているフォークのためのもので、あなたにはマージ先のプロジェクトで Developer 以上の役割が要る、とあります。
- 403「protected from force push」:メンテナーがブランチの保護で強制 push を許せます。許せないなら、リベースの代わりにマージでマージ先のブランチを取り込む(
git fetch origin・git merge origin/main・ふつうのgit push)。ソースでは、GitLab がリベースを求めるのはマージ先のブランチの最新のコミットが元のブランチに入っていないあいだだけで、マージでそれが入ります。 - 403「Source branch does not exist」:ブランチを push し直す(
git push -u origin feature)か、マージリクエストを閉じる。 - 409「Resource lock」:
stateを見る。開いているなら、リベースがもう進んでいます。待って、上のようにマージリクエストを読み直す。 - 409「Failed to enqueue」:少ししてからやり直す。
- 「Rebase failed: Rebase locally, resolve all conflicts…」:書いてあるとおりに。
git fetch origin・git rebase origin/main・衝突を解消してgit push --force-with-lease。 - 「The rebase pre-receive hook failed」:残りの文が言う点を直してから、もう一度リベースする。
IntelliJ IDEA で GitLab のマージリクエストを見るなら
Lesstep の Merge Request Inbox for GitLab は、JetBrains IDE(2024.1 以降)のプラグインです。GitLab がマージリクエストにリベースが要ると言うと、元のブランチのリベースを出します。GitLab が 403 で答えたときは、プロジェクトでの役割か設定があなたのアカウントに許していない可能性がある、と GitLab の文を添えて伝え、ほかの断りは GitLab の文で伝えます。202 の後は、GitLab がブランチをリベースしているので少しして読み直すよう伝えます。1.0.14 からは、リベースが後から失敗すると、GitLab が merge_error に書いた文を概要に出します(ブランチに次に push されるか、マージできるようになるまで)。見るのは無料、リベース・承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GITLAB は GitLab Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitLab Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitLab のマージの断り(405・409・422) · GitLab の自動マージの断り(405)・取り消し · GitLab の承認の断り(401・409) · GitLab のコメント・スレッドの断り(400・403) · GitLab のマージリクエストが作れない(409・422・400) · GitLab の「insufficient_scope」 · GitLab の 401「invalid_token」 · GitLab の 404「Project Not Found」 · GitLab の MR の一覧の断り(400・404) · GitLab の MR の変更が欠ける(「1000+」・too_large) · GitLab の 429「Retry later」(回数の上限) · GitLab のスカッシュでマージが断られる・失敗する · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · English