Your checkout has no branches (detached HEAD only)
ブランチに乗らず特定コミットを見ている状態。CIの既定チェックアウトが主因。
エラー文字列
Your checkout has no branches (detached HEAD only)
何が起きているか
リポジトリが detached HEAD の状態です。ブランチ上ではなく、特定のコミットを直接見ているため、比較対象にできるブランチがありません。
⚠️ これは壊れている状態ではありません。 Git として正常な状態のひとつで、意図せずそうなっていることが多いだけです。
なぜそうなるのか
| 状況 | 説明 |
|---|---|
| CI のチェックアウト | 多くの CI は、ブランチではなくコミットSHAを直接チェックアウトします。これが最多の原因 |
| タグをチェックアウトした | git checkout v1.2.3 はタグを指すため detached になる |
| コミットを直接指定した | git checkout abc1234 |
git bisect の途中 |
二分探索の各ステップは detached |
| サブモジュール | サブモジュールは既定で detached |
⭐ CI のログでこのエラーを見たら、原因を探す必要はありません。CI の既定動作です。
直し方
1. 現在の状態を確認する
git status
git branch --show-current
git rev-parse --abbrev-ref HEAD
判定は次のとおりです。実際に detached HEAD を作って確認した出力です。
| コマンド | detached HEAD のとき | ブランチ上のとき |
|---|---|---|
git branch --show-current |
何も返らない(空) | main などのブランチ名 |
git rev-parse --abbrev-ref HEAD |
HEAD という文字列 |
ブランチ名 |
git status の1行目 |
HEAD detached at 9d3af23 |
On branch main |
⭐ git status の1行目を見るのが一番速い判定法です。
git branch -a
ローカルにブランチが1つも無く、リモート追跡ブランチだけが並んでいることも多くあります。
2. 既存のブランチに乗る
git checkout main
リモートにしか無い場合は、追跡ブランチを作ります。
git checkout -b main origin/main
⚠️ 未コミットの変更があると失敗します。 先に退避してください。
git stash
git checkout main
git stash pop
3. 今の位置にブランチを作る
detached のまま作業していて、その内容を残したい場合はブランチを作ります。
git checkout -b work/current
実行後、git status の1行目が On branch work/current に変わります。
これが最も安全です。 detached HEAD のままコミットを重ねると、ブランチを移動した時点でどこからも参照されなくなり、見つけるのが難しくなります。
もし既に移動してしまった場合は、reflog から辿れます。
git reflog
git checkout -b recovered SHA
SHA は git reflog に出た、目的のコミットのハッシュに置き換えてください。
4. CI で解消する(最多のケース)
GitHub Actions
チェックアウト時にブランチを明示します。
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref || github.ref_name }}
fetch-depth: 0
⚠️ fetch-depth: 0 もあわせて指定してください。 detached を解消しても履歴が浅いままだと、今度は Could not find merge-base に当たります。この2つは同時に起きます。
プルリクエストのイベントでは、マージコミットがチェックアウトされる点にも注意してください。元のブランチを見たい場合は github.head_ref を使います。
GitLab CI
variables:
GIT_DEPTH: 0
GIT_STRATEGY: clone
Jenkins / その他
チェックアウト後に明示的にブランチへ乗せます。
git checkout -B "$BRANCH_NAME" "origin/$BRANCH_NAME"
5. 比較の起点を直接渡す
ブランチに乗せられない事情がある場合は、比較対象を明示して回避します。
git fetch origin main
git diff origin/main...HEAD
この形が動くなら、Claude Code 側にも同じ基準を伝えてください。
再発防止
- ⭐ CI で Git の差分を使う機能を動かすなら、
refとfetch-depth: 0をセットで指定する。 片方だけでは別のエラーに移るだけです - タグやコミットを直接チェックアウトして作業を始めない。必ずブランチを作る
- detached HEAD でコミットしてしまったら、移動する前にブランチを作る。移動後は
git reflogが頼りです git statusの1行目を読む習慣をつける。HEAD detached at ...と書いてあれば一目で分かります