【完全ガイド】git fatal: bad revision ‘HEAD’ の原因と解決方法|empty repository・HEADファイル破損・実践対処まで徹底解説
- 作成日 2026.07.13
- 更新日 2026.07.14
- git
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本でこのエラーに二度と困らないようになります。
- 1. 結論:ほぼ「commit がない」が原因
- 2. まず理解する:HEAD とは何か
- 3. 【原因①】commit がまだない(最頻出)
- 4. 【原因②】HEAD ファイル破損
- 5. 【原因③】HEAD が存在しないブランチを指す
- 6. 【原因④】Empty repository の clone
- 7. Homebrew などのツール経由での発生
- 8. 診断フロー
- 9. 実践シナリオ
- 10. 予防のベストプラクティス
- 11. トラブルシューティング
- 12. よくある質問(FAQ)
- 12.1. Q1. git init 直後、なぜエラー?
- 12.2. Q2. git status でも同じエラー
- 12.3. Q3. Homebrew でよく発生する
- 12.4. Q4. Fork(GUI)で発生
- 12.5. Q5. HEAD と HEAD~1 の違い
- 12.6. Q6. git rev-parse HEAD で確認
- 12.7. Q7. --allow-empty オプション
- 12.8. Q8. 空commit を作るデメリット
- 12.9. Q9. .git/HEAD のバックアップ
- 12.10. Q10. detached HEAD との違い
- 12.11. Q11. GitHub Actions で発生
- 12.12. Q12. WSL / Windows での違い
- 13. 参考リンク・関連資料
- 14. まとめ
結論:ほぼ「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 | 空リポジトリを clone | commit を作る |
診断コマンド
# 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層構造:
- HEAD: 現在のブランチを指す
- ブランチ: 特定のコミットを指す
- コミット: 実際の内容
「bad revision ‘HEAD’」の意味
翻訳: 「HEAD という参照は無効です」
つまり:
- Git が
HEADを評価しようとした - HEAD の先に有効なコミットがなかった
- → エラー
なぜ「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. HEAD と HEAD~1 の違い
HEAD: 現在の commitHEAD~1: 1つ前の commitHEAD^: 同じく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 公式
- git-rev-parse Documentation – rev-parse 公式
- git-symbolic-ref Documentation – HEAD 操作
- gitrevisions Documentation – revision の指定
まとめ
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公式ドキュメントもあわせてご確認ください。
-
前の記事
【完全ガイド】git cherry-pick の使い方|単一・範囲・マージコミット・conflictまで徹底解説 2026.07.13
-
次の記事
【完全ガイド】git fatal: not a git repository の原因と解決方法|.git探索順序・Docker/WSL/worktree対応まで徹底解説 2026.07.14
コメントを書く