gitを使用してバージョン管理を開始する際、最初のコミットを作成した後に、何らかの理由でそのコミットを取り消したい、あるいは修正したいという状況が発生することがあると思います.
私はちょうど先日 認証ファイルをinitial commitしてしまい,対面申し訳ないことをしてしまいました🙇♂️
その対処として以下のコマンドを実行しましたが...
git reset --mixed HEAD^1
このように怒られました
fatal: ambiguous argument 'HEAD^1': unknown revision or path not in the working tree.
これが起きた理由も合わせて,本記事では,gitの最初のコミット(initial commitまたはroot commit)を取り消す具体的な方法と、その際に発生しやすいエラーおよび対処法について解説します.
git については以下の記事で紹介しています
(準備)Initial Commitの作成
まず、リポジトリを初期化し、最初のコミットを作成する標準的な手順を確認します.
任意のディレクトリでgitリポジトリを作成する
git init
変更差分(ファイルの作成)を作成する
touch sample.txt
addする
git add sample.txt
commitする
git commit -m "initial commit"
この時点での git log
の出力は以下のようになります.
commit 000000000000000000000000000000000000000 (HEAD -> master)
Author: Your Name <your.email@example.com>
Date: Mon Jun 2 10:30:00 2025 +0900
initial commit
これで一般的な取り消し方であるgit reset
を使用してみます
一般的なコミット取り消しコマンド git reset
を使うと...?
直前のコミットを取り消す際によく用いられるコマンドは git reset
です. 例えば、git reset --mixed HEAD^1
は直前のコミットを取り消し、変更内容をステージングエリアとワーキングエリアに残します. しかし、これをinitial commitに対して実行すると問題が発生します.
resetをしてみる
git reset --mixed HEAD^1
このようにエラーが起きる
fatal: ambiguous argument 'HEAD^1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
このエラー fatal: ambiguous argument 'HEAD^1': unknown revision or path not in the working tree.
は、Gitが HEAD^1
を解決できないことを示しています. HEAD^1
(またはHEAD~1
)は現在のコミット(HEAD)の親コミットを指しますが、initial commitには親コミットが存在しないためです.
コミットの親子関係のイメージ
Initial Commitを取り消す推奨方法
Initial commitそのものを削除し、リポジトリをコミットが存在しない初期状態に戻すには、git update-ref -d HEAD
コマンドが適しています. このコマンドは、HEADが指す現在のブランチの参照を直接削除します.
git update-ref -d HEAD
実行後、git log
を実行すると以下のようになります.
git log
git logの結果
fatal: your current branch 'master' does not have any commits yet
これは、現在のブランチにコミットが存在しないことを示しています. git status
を確認すると、最初のコミットに含まれていたファイルはステージングされた状態に戻っています. これで、再度ファイルを編集したり、コミットメッセージを修正して新しいinitial commitを作成したりできます.
操作のイメージ:
注意点
-
ローカルリポジトリのみの場合:
git update-ref -d HEAD
はローカルリポジトリに対する操作です. リモートリポジトリにまだ何もpushしていない状態であれば、この方法で安全にinitial commitを取り消すことができます. -
既にリモートリポジトリにpush済みの場合:
もしinitial commitを既にリモートリポジトリにpushしてしまっている場合、git update-ref -d HEAD
でローカルのコミットを削除した後にリモートにpushするには、git push --force
またはgit push --force-with-lease
が必要になります. これはリモートリポジトリの履歴を強制的に書き換える操作であり、他の共同作業者がいる場合はコンフリクトや混乱を引き起こす可能性があるため、慎重に行う必要があります.
チームで開発している場合は、履歴の書き換えについて事前に周知しましょう.
代替案として、git revert
でinitial commitの変更を打ち消す新たなコミットを作成することも検討できますが、initial commit自体は履歴に残ります.
このようにしてinitial commitを取り消すことができます.initlal commitで脳死でgit add .
をしてしまわないようにするのは大事ですが,人間なのでやらかしてしまうでしょう.その際は落ち着いて注意点を確認しつつ本記事で紹介した方法で対処してください!
credentialファイルをcommitしないように気をつけましょう😭