Claude Code のエラー

Could not find merge-base with <branch>

結論

比較元との共通の祖先が見つからない状態。浅いクローンが最も多い原因。

確認した版 Claude Code v2.1.214
確認日 2026年8月21日
文言の照合 Claude Code v2.1.238
最終更新 2026年8月21日
根拠 実機で確認

エラー文字列

Claude Code
Could not find merge-base with <branch>

何が起きているか

git merge-base が、現在のブランチと比較対象のブランチの共通の祖先を見つけられませんでした。差分をとる機能(レビューやセキュリティチェックなど)はこの祖先を起点にするため、見つからないと処理を始められません。

原因は次のとおりで、CI では1番、手元では2番と3番が多くあります。

# 原因 状況
1 浅いクローン(shallow clone) CI の既定が --depth=1。履歴が1コミットしか無く、祖先まで辿れない
2 ブランチ名が違う main を指定したが実際は master、あるいは origin/ が抜けている
3 リモートを取得していない ローカルに比較対象のブランチが存在しない
4 履歴が本当に繋がっていない 別々に初期化したリポジトリを後から結合した

直し方

1. まず状況を確認する

git branch -a
git log --oneline -1
git rev-parse --is-shallow-repository

git rev-parse --is-shallow-repositorytrue を返したら、原因は浅いクローンで確定です。

2. 浅いクローンを深くする(原因 1)

⚠️ --unshallow だけでは直りません。 履歴は繋がりますが、比較対象のブランチはまだ取得されていないためです。2手セットで実行してください。

git fetch --unshallow
git fetch origin main:refs/remotes/origin/main

実際に浅いクローンを作って検証した結果です。

手順 is-shallow git merge-base HEAD origin/main
--depth 1 でクローンした直後 true 失敗(終了コード 1・出力なし)
git fetch --unshallow の後 false まだ失敗
さらに対象ブランチを fetch した後 false 成功(SHA が返る)

git merge-base は失敗時に何も出力せず終了コード 1 を返します。 「実行したのに何も出ない」=失敗しています。成功していれば SHA が1行返ります。

--unshallow が使えない(そもそも浅くない)場合は、履歴をすべて取得します。

git fetch --all --tags --prune

GitHub Actions の場合

チェックアウトの設定で履歴の深さを指定します。⚠️ 既定は fetch-depth: 1 なので、明示しないと必ずこのエラーに当たります。

- uses: actions/checkout@v4
  with:
    fetch-depth: 0   # 0 = 全履歴

全履歴が重い大規模リポジトリでは、必要な分だけにできます。

- uses: actions/checkout@v4
  with:
    fetch-depth: 50

GitLab CI の場合

variables:
  GIT_DEPTH: 0

3. ブランチ名を確認する(原因 2)

git branch -a

⚠️ よくある取り違えが3つあります。

指定したもの 実際
main リポジトリの既定が master だった
main ローカルに main が無く、origin/main しか無い
develop origin/develop を取得していない

リモート側の既定ブランチは次で確認できます。

git symbolic-ref refs/remotes/origin/HEAD --short

⚠️ 次のエラーが出ることがあります。

fatal: ref refs/remotes/origin/HEAD is not a symbolic ref

これは壊れているわけではありません。 origin/HEADgit clone のときに設定されるもので、浅いクローン、git init してから git remote add した場合、CI のチェックアウトなどでは設定されていません。次で設定できます。

git remote set-head origin -a

origin/HEAD set to main のように、実際の既定ブランチ名が表示されます。

比較対象は origin/ を付けて指定するほうが確実です。

git merge-base HEAD origin/main

これが動けば、Claude Code 側にも同じ形で渡してください。

4. リモートを取得する(原因 3)

浅いクローンでなくても、対象ブランチをローカルに持っていないことがあります。

git fetch origin main:refs/remotes/origin/main

あるいはすべて取得します。

git remote -v
git fetch --all --prune

⚠️ git remote -v で何も表示されないなら、リモートが設定されていません。 ローカルだけで初期化したリポジトリではこの機能は使えません。

5. 履歴が本当に繋がっていない場合(原因 4)

別々に作ったリポジトリを結合すると、共通の祖先が存在しません。

git merge-base HEAD origin/main

これが何も返さず、--is-shallow-repositoryfalse なら、構造的に祖先が無い状態です。

比較の起点を明示するしかありません。

git log --oneline --all | tail -20

意図した起点のコミットを見つけ、そこを基準に差分を取ってください。

6. 似たエラーとの区別

表示 原因
Could not find merge-base with <branch> 共通の祖先が見つからない
Your checkout has no branches (detached HEAD only) ブランチ自体が無い

CI では両方が同時に起きていることがあります。浅いクローンかつ detached HEAD、という状態です。

再発防止

  • CI で差分を使う機能を動かすなら、fetch-depth: 0 を最初から設定する。 既定の浅いクローンでは動きません
  • 比較対象は origin/ を付けて指定する。ローカルにブランチがあるとは限りません
  • リポジトリの既定ブランチ名(main / master)をチームで統一しておく
  • 大規模リポジトリで全履歴が重い場合は、fetch-depth に十分な数値を入れる。1 以外なら、多くの場合これで足ります

この手順で直りませんでしたか?

環境を添えて報告いただければ、追加の原因を検証してこのページに反映します。

エラーを報告する