gitのInitial Commit(最初のコミット)を取り消す方法

gitを使用してバージョン管理を開始する際、最初のコミットを作成した後に、何らかの理由でそのコミットを取り消したい、あるいは修正したいという状況が発生することがあると思います.
私はちょうど先日 **認証ファイルをinitial commitしてしまい**，対面申し訳ないことをしてしまいました🙇‍♂️
その対処として以下のコマンドを実行しましたが...
```bash
git reset --mixed HEAD^1
```
このように怒られました
```bash
fatal: ambiguous argument 'HEAD^1': unknown revision or path not in the working tree.
```
これが起きた理由も合わせて，本記事では，gitの最初のコミット（initial commitまたはroot commit）を取り消す具体的な方法と、その際に発生しやすいエラーおよび対処法について解説します.

git については以下の記事で紹介しています

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

### (準備)Initial Commitの作成

まず、リポジトリを初期化し、最初のコミットを作成する標準的な手順を確認します.
任意のディレクトリでgitリポジトリを作成する
```bash
git init
```
変更差分(ファイルの作成)を作成する
```bash
touch sample.txt
```
addする
```
git add sample.txt
```
commitする
```
git commit -m "initial commit"
```
この時点での `git log` の出力は以下のようになります.

```text
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をしてみる
```bash
git reset --mixed HEAD^1
```
このようにエラーが起きる
```bash
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には親コミットが存在しないためです.

**コミットの親子関係のイメージ**
```mermaid
graph TD
　　親コミットなし??? --X--> A;
    A["Initial Commit (f7f9316)"];
```

### Initial Commitを取り消す推奨方法

Initial commitそのものを削除し、リポジトリをコミットが存在しない初期状態に戻すには、`git update-ref -d HEAD` コマンドが適しています. このコマンドは、HEADが指す現在のブランチの参照を直接削除します.

```bash
git update-ref -d HEAD
```

実行後、`git log` を実行すると以下のようになります.
```bash
git log
```
git logの結果
```bash
fatal: your current branch 'master' does not have any commits yet
```
これは、現在のブランチにコミットが存在しないことを示しています. `git status` を確認すると、最初のコミットに含まれていたファイルはステージングされた状態に戻っています. これで、再度ファイルを編集したり、コミットメッセージを修正して新しいinitial commitを作成したりできます.

**操作のイメージ：**
```mermaid
graph TD
    subgraph "Before"
       親コミットなし??? --X--> A;
       A["Initial Commit (f7f9316)"];
    end

    subgraph "After 'git update-ref'"
        direction LR
        master2["master (no commits)"]
        HEAD2["HEAD"] --> master2
        B["sample.txt(ステージングエリア)"]
    end
```

### 注意点

* **ローカルリポジトリのみの場合:**
    `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しないように気をつけましょう😭