深夜のクイック修正
git init を実行した直後にこの壁にぶつかったとしても、慌てる必要はありません。おそらく、作成して数秒しか経っていないリポジトリで git log や git diff を実行しようとしているのでしょう。問題は単純です。リポジトリにまだコミットが存在しないからです。
Git は HEAD を参照できません。なぜなら、HEAD が指しているブランチがまだ「誕生」していないからです。すぐに修正するには、最初のスナップショットを作成するだけです。以下のコマンドを実行してください:
git add .
git commit -m "initial commit"
最初のコミットが履歴に記録されれば、HEAD は有効な参照となり、コマンドは期待通りに動作するようになります。
エラーメッセージの詳細
新しいプロジェクトで履歴を確認したり、変更を比較しようとした際に、おそらく以下のエラーに遭遇したはずです:
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
なぜこれが発生するのか(「未誕生」のブランチ)
Git において、HEAD は現在のブランチの先端を指すポインタです。git init を実行すると、Git は .git ディレクトリを作成し、デフォルトのブランチ名(通常は main または master)を設定します。.git/HEAD の中身を確認すると、ref: refs/heads/main のような参照が見つかるはずです。
落とし穴は、refs/heads/main というファイルがまだ存在しないことです。このファイルは、最初のコミットを行った後に初めて作成されます。その瞬間まで、あなたは履歴のない「未誕生(unborn)」のブランチにいることになります。
git log を実行すると、Git は読み取りを開始する場所を探すために HEAD を参照します。しかし、HEAD が存在しないファイルを指しているため、Git は混乱してしまいます。Git は、それがブランチなのか、タグなのか、あるいは「HEAD」という名前のファイルそのものなのかを判別できないため、ambiguous argument(曖昧な引数)エラーをスローするのです。
どのような時に発生するか?
1. 新規リポジトリで履歴を確認する
初期化直後に、正しく動作しているか確認するために本能的に git log と入力してしまうかもしれません。Git バージョン 2.22 より前では、表示するコミットがゼロであるため、ほぼ確実に「unknown revision(不明なリビジョン)」エラーが発生します。
2. git diff HEAD で変更を比較する
コードを追加し、前回のコミットと比較して差分を確認したいとします。しかし、まだ「前回のコミット」が存在しないため、HEAD は無効なターゲットとなり、diff は失敗します。
3. CI/CD パイプラインと自動化
自動化スクリプトが原因であることも多いです。スクリプトが git rev-parse HEAD を使って現在のコミットハッシュを取得しようとする場合があります。初期化されたばかりのテンプレート上でそのスクリプトが実行されると、この致命的なエラーでクラッシュしてしまいます。
解決策
方法 1:最初のコミットを行う(推奨)
標準的な修正方法は、Git が指し示す対象を作成することです。すべてのプロジェクトには、時間の起点が必要です。
# フォルダが空の場合はファイルを作成する
touch README.md
# ファイルをステージングする
git add .
# 最初のコミットを作成する
git commit -m "chore: initialize repository"
方法 2:git status を使って状況を確認する
コミットする準備はできていないが進捗を確認したい場合は、git log を使うのをやめて、代わりに git status を使用してください。このコマンドは、コミットが存在しない場合でも動作するように設計されています。現在のブランチが初期状態であることを伝え、参照エラーを出すことなくステージングされたファイルをリストアップしてくれます。
方法 3:スクリプトの保護(rev-parse)
スクリプトを作成していますか? 履歴ベースのコマンドを実行する前に、HEAD が実際に存在するかどうかを確認する必要があります。以下のロジックを使用してください:
if git rev-parse --verify HEAD >/dev/null 2>&1; then
echo "履歴が見つかりました。続行します..."
git log -1
else
echo "空のリポジトリが検出されました。"
fi
この単純なチェックにより、空のリポジトリに遭遇したときに CI/CD パイプラインが失敗するのを防ぐことができます。
方法 4:ステージングされた変更の確認
新規リポジトリでは HEAD が無効であるため、git diff --cached HEAD は使用できません。現在インデックスにある(最初のコミットのためにステージングされた)内容を確認するには、git status または git ls-files --stage を使用してください。これらのツールは、存在しないコミットと比較するのではなく、インデックスを直接参照します。
検証:解決したか?
最初のコミットが完了したら、以下のコマンドを実行してみてください:
git log --oneline
修正が成功していれば、7文字の短縮ハッシュとメッセージが表示されます:
a1b2c3d (HEAD -> main) initial commit
さらに、git rev-parse HEAD はエラーではなく、40文字の完全な SHA-1 ハッシュを返すようになります。
まとめ
fatal: ambiguous argument 'HEAD' というエラーは、「履歴を確認しようとしているが、まだ履歴が始まっていない」という Git からのメッセージに過ぎません。技術的な詳細を深く考えすぎる必要はありません。最初のファイルをコミットすれば、エラーは消えます。

