Claude Code のエラー

Your checkout has no branches (detached HEAD only)

結論

ブランチに乗らず特定コミットを見ている状態。CIの既定チェックアウトが主因。

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

エラー文字列

Claude Code
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

SHAgit 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 の差分を使う機能を動かすなら、reffetch-depth: 0 をセットで指定する。 片方だけでは別のエラーに移るだけです
  • タグやコミットを直接チェックアウトして作業を始めない。必ずブランチを作る
  • detached HEAD でコミットしてしまったら、移動する前にブランチを作る。移動後は git reflog が頼りです
  • git status の1行目を読む習慣をつける。HEAD detached at ... と書いてあれば一目で分かります

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

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

エラーを報告する