【完全ガイド】git fatal: bad revision ‘HEAD’ の原因と解決方法|empty repository・HEADファイル破損・実践対処まで徹底解説

  • 作成日 2026.07.13
  • 更新日 2026.07.14
  • git
【完全ガイド】git fatal: bad revision ‘HEAD’ の原因と解決方法|empty repository・HEADファイル破損・実践対処まで徹底解説

Git を使い始めたばかりの人、もしくはリポジトリを触っていて突然遭遇する謎めいたエラー:

$ git log
fatal: your current branch 'main' does not have any commits yet

$ git log HEAD
fatal: bad revision 'HEAD'

$ git stash
fatal: bad revision 'HEAD'

さらに、まったく無関係に見えるコマンドでも発生:

$ brew update
fatal: bad revision 'HEAD'
Error: Failure while executing: git ...

「HEAD が bad ってどういうこと?」「revision が変だとは?」と混乱する場面。

このエラーは、Git 初心者を混乱させる代表格。しかも、エラーメッセージから原因を推測しにくいのが厄介です。

現場では:

  • git init してすぐに git log した
  • Homebrew の brew update で発生
  • CI/CD ツール(Jenkins等)で発生
  • fork や clone した直後
  • .git/HEAD を触ってしまった

など、様々な状況で遭遇。しかも、単なる警告ではなく、多くのコマンドが動かなくなるのが特徴です。

本記事では、fatal: bad revision 'HEAD'完全な原因と解決方法を、リファレンスとして実用的に整理します。HEAD の本質、4つの発生原因、各パターン別対処、Homebrew などのツール経由での発生、CI/CD での対応、実践シナリオ、予防のベストプラクティス、FAQまで完全網羅。この1本でこのエラーに二度と困らないようになります。


目次

結論:ほぼ「commit がない」が原因

時間がない方向けに、最短の対処手順を示します。

最頻出パターン:commit がない

# 症状
git init
git log
# fatal: your current branch 'main' does not have any commits yet

# 解決:最初の commit を作る
echo "# README" > README.md
git add README.md
git commit -m "Initial commit"

# → もう出ない
git log
# → 正常

4大原因と対処

原因症状解決
① commit がないinit 直後最初の commit を作る
② HEAD ファイル破損.git/HEAD が壊れたHEAD の再作成 or clone
③ 存在しないブランチを HEAD が指す変な状態git symbolic-ref HEAD で修正
④ Empty repo の clone空リポジトリを clonecommit を作る

診断コマンド

# 1. HEAD ファイル確認
cat .git/HEAD
# → ref: refs/heads/main か、SHAが表示されるべき

# 2. コミット存在確認
git log --oneline
# → 空 or エラー

# 3. ブランチ確認
git branch
# → 空 or 表示

# 4. 総合診断
git status

詳細は以下で解説します。


まず理解する:HEAD とは何か

HEAD の本質

HEAD は、Git における「現在自分がいる場所」を示すポインタ。実体は .git/HEAD というファイル:

cat .git/HEAD
# ref: refs/heads/main

これは「今、refs/heads/main を指してるよ」という意味。

HEAD の仕組み図解

[.git/HEAD]
    ↓
[refs/heads/main](ブランチ)
    ↓
[commit abc1234](コミット)
    ↓
[実際のファイル状態]

3層構造:

  1. HEAD: 現在のブランチを指す
  2. ブランチ: 特定のコミットを指す
  3. コミット: 実際の内容

「bad revision ‘HEAD’」の意味

翻訳: 「HEAD という参照は無効です」

つまり:

  1. Git が HEAD を評価しようとした
  2. HEAD の先に有効なコミットがなかった
  3. → エラー

なぜ「HEAD がない」ことがあるか

  • コミットゼロ: HEAD の先のブランチがまだ存在しない(commit がないため)
  • HEAD ファイル破損: .git/HEAD が壊れた
  • 存在しないブランチ指定: HEAD が指すブランチファイルが実在しない

【原因①】commit がまだない(最頻出)

症状

mkdir new-project
cd new-project
git init

# エラーが出る典型パターン
git log
# fatal: your current branch 'main' does not have any commits yet
# または(古い Git)
# fatal: bad default revision 'HEAD'

git log HEAD
# fatal: bad revision 'HEAD'

git stash
# fatal: bad revision 'HEAD'

git rev-parse HEAD
# HEAD
# fatal: bad revision 'HEAD'

確認方法

# HEAD ファイルは存在するが
cat .git/HEAD
# ref: refs/heads/main

# 指す先のブランチファイルが存在しない
ls .git/refs/heads/
# 空

# または
git branch
# 何も表示されない

解決

最初の commit を作れば解決:

# ファイル作成
echo "# My Project" > README.md

# add & commit
git add README.md
git commit -m "Initial commit"

# 確認
git log --oneline
# abc1234 Initial commit

git branch
# * main

これで HEAD が有効な commit を指す ようになり、エラー解消。

なぜ Git はこの状態を許すか

Git の設計上、git init は「準備段階」であり、commit がないのは正常な状態。ただし、多くのコマンドは「commit がある前提」で動くため、こういうエラーが発生します。


【原因②】HEAD ファイル破損

症状

git status
# fatal: bad revision 'HEAD'

# または
git log
# fatal: bad revision 'HEAD'

コミットもあるはずなのにエラー。

確認

cat .git/HEAD
# 内容が予期せぬもの、または空

正常な HEAD の中身(例):

ref: refs/heads/main

これが空、または xyz789... のような存在しないSHA、あるいは壊れた文字列だとエラー。

解決方法A:HEAD を修復

# main ブランチが存在するなら
echo "ref: refs/heads/main" > .git/HEAD

# または(Git 2.23+)
git symbolic-ref HEAD refs/heads/main

解決方法B:バックアップから復元

もし .git のバックアップがあるなら:

cp ~/backup/.git/HEAD .git/HEAD

解決方法C:fresh clone(推奨・最も安全)

# 1. ローカルの変更をバックアップ
cp -r . /tmp/backup

# 2. 削除して clone
cd ..
rm -rf project
git clone https://github.com/user/project.git
cd project

# 3. 変更を戻す
cp -r /tmp/backup/src/* src/  # 必要に応じて
git add .
git commit -m "Restore local changes"

破損が疑われる場合は fresh clone が最も確実


【原因③】HEAD が存在しないブランチを指す

症状

cat .git/HEAD
# ref: refs/heads/typo-branch-name

ls .git/refs/heads/
# main  develop
# typo-branch-name が存在しない

存在しないブランチファイルを HEAD が指している状態。

解決

# 正しいブランチに切り替え
git symbolic-ref HEAD refs/heads/main

# または
git checkout main

【原因④】Empty repository の clone

症状

リモートに commit がないリポジトリを clone:

# GitHub で新規リポジトリ作成(README なし、gitignore なし)
git clone https://github.com/user/empty-repo.git
cd empty-repo

git log
# fatal: your current branch 'main' does not have any commits yet

Git GUI ツール(Fork、SourceTree 等)でも同様のエラーが出ることがあります。

解決

commit を作って push:

echo "# repo" > README.md
git add README.md
git commit -m "Initial commit"
git push origin main

Homebrew などのツール経由での発生

brew update での発生

brew update
# fatal: bad revision 'HEAD'
# fatal: bad revision 'HEAD'
# fatal: Needed a single revision
# You do not have the initial commit yet
# Error: Failure while executing: git -c ... stash save

原因

Homebrew は /usr/local/Homebrew/ などにある Git リポジトリを内部で管理。そのリポジトリの状態が壊れたときに発生。

解決

Homebrew の場合:

# Homebrew の git 状態確認
cd $(brew --repository)
git status

# HEAD 修復
git symbolic-ref HEAD refs/heads/master  # または main

# fetch で最新化
git fetch --unshallow
git reset --hard origin/master

# 再度 brew update
brew update

CI/CD での発生(Jenkins など)

Jenkins などのビルドツールでも同種のエラー:

> git rev-parse HEAD
fatal: bad revision 'HEAD'

原因: shallow clone や特定の状態が問題。

対処:

  • Deep clone を使う(fetch-depth: 0
  • workspace のクリーンアップ
  • Git plugin の設定見直し

診断フロー

1. git log --oneline
   ├─ 空 or エラー → 【原因①④】commit なし
   └─ 表示される → 別問題

2. cat .git/HEAD
   ├─ 空・破損 → 【原因②】HEAD破損
   ├─ 存在しないブランチ → 【原因③】ブランチ不在
   └─ 正常 → 別要因

3. ls .git/refs/heads/
   ├─ 空 → commit なし
   └─ 表示 → HEAD の参照先を確認

4. git status
   ├─ fatal → 深刻な問題
   └─ 動く → 大丈夫

実践シナリオ

シナリオ1:GitHub 新規リポジトリ

# GitHub で「Initialize with README」なしで作成 → 完全空

git clone https://github.com/user/empty.git
cd empty
git log
# fatal: your current branch 'main' does not have any commits yet

# 対処:最初の commit
echo "# empty" > README.md
git add README.md
git commit -m "Initial commit"
git branch -M main
git push -u origin main

詳細はerror: src refspec does not match any の記事も参照。

シナリオ2:git init 直後の VS Code

mkdir project
cd project
git init
code .
# VS Code の Source Control タブでエラー

# 解決:commit
echo "" > .gitkeep
git add .gitkeep
git commit -m "Initial commit"

シナリオ3:Homebrew の修復

brew update
# fatal: bad revision 'HEAD'

# 修復
cd $(brew --repository)
cat .git/HEAD
# → 内容確認

# 通常は
git symbolic-ref HEAD refs/heads/master
git fetch origin
git reset --hard origin/master

brew update  # 再実行

シナリオ4:Rails 新規プロジェクト直後

rails new my-app
cd my-app

# 通常、rails new は自動で commit する
git log
# → 最初の commit があるはず

# もし commit がなければ手動で
git add .
git commit -m "Initial Rails 8 skeleton"

詳細はRails 8 アップグレードガイドの記事も参照。

シナリオ5:CI/CD の設定

# .github/workflows/ci.yml
- uses: actions/checkout@v4
  with:
    fetch-depth: 0   # ⭐ 全履歴取得

- name: Check HEAD
  run: git rev-parse HEAD
  # → 通常は成功

fetch-depth: 1(shallow)だと稀にエラー。

シナリオ6:CI で bad revision HEAD

- name: Recovery
  run: |
    cat .git/HEAD || echo "HEAD missing"
    git symbolic-ref HEAD refs/heads/main || true
    git rev-parse HEAD || true

デバッグ用の一時対処。

シナリオ7:Docker container 内で発生

docker exec -it container bash
cd /app
git log
# fatal: bad revision 'HEAD'

# container 内では init 済みで commit なしのパターン
git add . && git commit -m "Initial"

詳細はdocker daemon 接続エラーの記事も参照。

シナリオ8:Kamal デプロイ準備

# 新規 Rails プロジェクトを Kamal 用に準備
git init  # rails new が既にやってるが

# Kamal 設定ファイル追加
git add config/deploy.yml .kamal/
git commit -m "Add Kamal configuration"

# GitHub に push
git remote add origin ...
git push -u origin main

詳細はKamal 2 デプロイの記事も参照。

シナリオ9:worktree での発生

git worktree add ../feature-branch feature
cd ../feature-branch
git log
# 通常は動く
# エラーが出るなら worktree 状態を確認
git worktree list

シナリオ10:submodule での発生

cd submodule
git log
# fatal: bad revision 'HEAD'

# submodule が未初期化の可能性
cd ..
git submodule update --init --recursive

予防のベストプラクティス

1. git init の直後に commit

git init
touch .gitkeep   # または README.md
git add .
git commit -m "Initial commit"

空の状態を作らないのがコツ。

2. .git ディレクトリを触らない

.git の中身を手動で編集・削除すると危険。特に:

  • .git/HEAD
  • .git/refs/heads/*
  • .git/objects/*

編集が必要な場合は Git コマンド経由で。

3. バックアップ習慣

重要な作業前に:

# .git のバックアップ
cp -r .git .git.backup

# 復元
rm -rf .git
mv .git.backup .git

4. GitHub / GitLab は README ありで作成

新規リポジトリ作成時:
✅ Initialize with README にチェック
→ 空リポジトリの罠を回避

ただしローカル既存プロジェクトを push する場合は README なしで作成(unrelated histories 対策)。

詳細はfatal: refusing to merge unrelated histories の記事も参照。

5. CI/CD で fetch-depth 設定

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

6. Homebrew を定期的に更新

# 定期実行
brew update
brew doctor

問題発生前に検知。

7. git status を習慣に

作業前に:

git status

HEAD の状態が正常かを素早く確認。


トラブルシューティング

commit 作ってもまだエラー

git commit -m "Initial"
git log
# fatal: bad revision 'HEAD'

→ HEAD が破損:

cat .git/HEAD
# 内容確認
git symbolic-ref HEAD refs/heads/main

.git/HEAD を編集後に大惨事

echo "invalid content" > .git/HEAD
git status
# fatal: bad revision 'HEAD'

修復:

git symbolic-ref HEAD refs/heads/main
# または直接編集
echo "ref: refs/heads/main" > .git/HEAD

全ブランチが消えた

ls .git/refs/heads/
# 空

git branch
# 何も表示されない

reflog で救済:

git reflog
# 過去のHEAD 状態を表示

または:

# packed-refs から復旧
cat .git/packed-refs

fatal: bad object HEAD(似た別エラー)

fatal: bad object HEAD

これは HEAD が指すオブジェクト自体が破損。

対処:

# 修復不能なら fresh clone
git fsck --full
git gc --prune=now

または fresh clone が最も安全。

GUI ツールで見えるが CLI で見えない

# SourceTree ではリポジトリが見えるが
git log
# fatal: bad revision 'HEAD'

GUI のキャッシュや設定の可能性。CLI で状態確認:

cat .git/HEAD
git status

よくある質問(FAQ)

Q1. git init 直後、なぜエラー?

Git の設計。init は準備段階で、commit がゼロだと HEAD が有効な commit を指せない。

対処:最初の commit を作る

Q2. git status でも同じエラー

はい、多くのコマンドで発生。commit を作る or HEAD 修復

Q3. Homebrew でよく発生する

Homebrew は内部で Git リポジトリを使う。その内部リポジトリの状態が壊れた場合に発生。修復方法は上述。

Q4. Fork(GUI)で発生

Fork や SourceTree などの GUI は、内部で Git コマンドを叩く。空リポジトリだと同じエラー。まず commit を作る

Q5. HEADHEAD~1 の違い

  • HEAD: 現在の commit
  • HEAD~1: 1つ前の commit
  • HEAD^: 同じく1つ前

commit がなければどちらもエラー。

Q6. git rev-parse HEAD で確認

git rev-parse HEAD
# 正常: abc1234567890abcdef
# エラー: fatal: ambiguous argument 'HEAD'

HEAD が有効か素早く確認

Q7. --allow-empty オプション

git commit --allow-empty -m "Initial empty commit"

変更なしでも commit。最初の commit を作る手段として有効。

Q8. 空commit を作るデメリット

デメリットはほぼなし。むしろ HEAD が有効になるメリットが大きい。

Q9. .git/HEAD のバックアップ

cp .git/HEAD ~/.git-head-backup

修復用に保存しておく。

Q10. detached HEAD との違い

  • bad revision ‘HEAD’: HEAD が有効な commit を指せない
  • detached HEAD: HEAD がブランチではなく直接 commit を指す(正常)

まったく違う状態。詳細は今後の記事で解説予定。

Q11. GitHub Actions で発生

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

fetch-depth を明示。または ref の指定を確認。

Q12. WSL / Windows での違い

改行コードの違いで .git/HEAD が壊れることがある。

対処:

# LF で保存
echo -n "ref: refs/heads/main" > .git/HEAD

参考リンク・関連資料

Git 公式


まとめ

fatal: bad revision 'HEAD' の解決、要点を再整理します。

4大原因

#原因診断解決
commit なしgit log でエラー最初の commit を作る
HEAD ファイル破損.git/HEAD 確認git symbolic-ref HEAD
存在しないブランチ.git/refs/heads/ 確認git checkout <branch>
Empty repo clone空のリモートcommit を作って push

最速の解決手順

# 1. commit がないなら作る
echo "# repo" > README.md
git add README.md
git commit -m "Initial commit"

# 2. HEAD が壊れていたら
git symbolic-ref HEAD refs/heads/main

# 3. どうにもならなければ fresh clone
git clone https://github.com/user/repo.git

HEAD の仕組み

.git/HEAD (ファイル)
    ↓ ref: refs/heads/main
.git/refs/heads/main (ブランチ)
    ↓ abc1234...
.git/objects/abc12... (コミット)

この3層のどこかが破綻するとエラー。

診断コマンド

cat .git/HEAD           # HEAD の中身
ls .git/refs/heads/     # ブランチ一覧
git log --oneline       # コミット一覧
git branch              # ブランチ一覧
git status              # 総合状態
git rev-parse HEAD      # HEAD が指す commit

予防策

  • git init 後すぐに commit(空を作らない)
  • .git を手動で触らない(コマンド経由で操作)
  • .git のバックアップ習慣(重要作業前)
  • GitHub 新規は README あり(空 clone を避ける)
  • CI/CD は fetch-depth: 0 設定
  • Homebrew を定期更新

事故防止

  • .git/HEAD の編集は避ける
  • 修復不能なら fresh clone
  • reflog で救済可能なケースも
  • バックアップは早めに

類似エラーとの見分け

  • fatal: bad revision 'HEAD': HEAD の状態問題
  • fatal: bad object HEAD: HEAD が指すオブジェクト破損
  • error: src refspec does not match any: push 時の初回問題
  • HEAD detached at ...: 意図的な状態(正常)

これらの知識は、新規プロジェクトのセットアップ・Git リポジトリの復旧・Homebrew などツールの修復・CI/CD トラブル対応・Rails / Docker 開発など、あらゆる場面で活用できます。本記事をブックマークしておけば、このエラーで慌てず正確に対処できるようになります。


本記事は2026年6月時点の情報をもとに、Git 2.40+ での動作確認・公式ドキュメントに基づき作成しています。Git のバージョンによって挙動が異なる場合があるため、最新の情報はGit公式ドキュメントもあわせてご確認ください。