Lesstep
GitLab・マージリクエスト・スカッシュしてマージ・2026年10月28日に確認

GitLab:スカッシュのせいでマージが断られた・失敗した

GitLab は、スカッシュの設定がそうなっていると、マージリクエストのコミットを1つにまとめて(スカッシュして)マージします。設定がスカッシュを必須にしているのにマージがスカッシュを頼まなかったとき、またはスカッシュそのものが失敗したときは、マージされません。このときマージの API は 422 の Branch cannot be merged だけを返し、理由はマージリクエストの merge_error に残します。マージリクエストの画面に出るのもこの文です(GitLab のソース lib/api/merge_requests.rb と app/services/merge_requests/merge_service.rb・2026年10月28日に読んだもの)。理由は次のどれかです:

This project requires squashing commits when merge requests are accepted.
Squashing failed: The commits have conflicting changes. Squash the commits locally, resolve the conflicts, then push the branch.
Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch.

スカッシュの設定

マージされなかった理由

効いている設定の見方

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

query {
  project(fullPath: "group/project") {
    mergeRequest(iid: "42") { squash squashOnMerge squashReadOnly mergeError }
    branchRules { nodes { name squashOption { option } } }
  }
}

どうするか

マージの API のほかの答え(405・409・401・400)はGitLab がマージを断った理由へ。

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

Lesstep の Merge Request Inbox for GitLab は、JetBrains IDE(2024.1 以降)のプラグインで、IDE からマージリクエストをマージできます。マージの画面は、GitLab がそのマージリクエストをどうスカッシュするか(squashOnMerge・squashReadOnly)を読むので、保護された対象のブランチのスカッシュの設定も入ります。必須ならスカッシュの欄を選んで固定、認めていなければ外して固定します。マージが 422 で失敗したときは、GitLab が残した理由(merge_error。「This project requires squashing commits when merge requests are accepted.」など)を出します。1.0.19 より前は、プロジェクトの設定だけを見ていました。見るのは無料、承認・コメント・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。

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

ほかに:GitLab のマージの断り(405・409・422) · GitLab の自動マージの断り(405)・取り消し · GitLab のリベースの断り・失敗(403・409) · GitLab の 429「Retry later」(回数の上限) · GitLab の「compare_timeout」(差分の上限) · JetBrains の IDE で GitLab のマージリクエストを扱う · English