Could not find merge-base with <branch>
比較元との共通の祖先が見つからない状態。浅いクローンが最も多い原因。
エラー文字列
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-repository が true を返したら、原因は浅いクローンで確定です。
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/HEAD は git 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-repository も false なら、構造的に祖先が無い状態です。
比較の起点を明示するしかありません。
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以外なら、多くの場合これで足ります