Git commitを間違えた時の救済コマンド集
【初心者向けまとめ】
「あっ!間違えてコミットしちゃった!」そんな経験、誰にでもありますよね。
この記事ではGitで起きがちなミスとその解決方法を、初心者でもわかるように解説します。
目次
- コミットメッセージを間違えた
- コミットするファイルを間違えた
- コミット自体をなかったことにしたい
- 間違えて
git reset --hardしてしまった(最終手段) - すでにプッシュしてしまった場合
- まとめ(状況別フローチャート)
前提知識
HEADとは
HEADは「今いる場所」を指すポインタです。通常は最新のコミットを指しています。
HEAD^とHEAD~の違い
-
HEAD^またはHEAD~1は、HEADの1つ前のコミット -
HEAD^^またはHEAD~2は、HEADの2つ前のコミット -
HEAD~3は、HEADの3つ前のコミット
どちらを使っても同じ結果になるので、好きな方を使ってOKです。
1. コミットメッセージを間違えた
状況
git commit -m "機能追加"
# あっ!メッセージ適当すぎた!
解決方法
直前のコミットメッセージだけを修正したい場合は、--amendオプションが便利です。
git commit --amend -m "ユーザー認証機能の追加"
これで、コミットメッセージだけが書き換わります。ファイルの内容は変わりません。
エディタで修正したい場合
git commit --amend
-mオプションをつけずに実行すると、エディタが開いてメッセージを編集できます。
注意点
- まだ
git pushしていない場合のみ使用してください - すでにプッシュ済みの場合は後述の方法を参照
2. コミットするファイルを間違えた
状況
git add config.json # 設定ファイルをaddしちゃった
git commit -m "機能追加"
# あっ!config.jsonは含めたくなかった!
解決方法(パターン1:ファイルを追加したい)
コミットし忘れたファイルがあった場合も--amendが使えます。
git add 忘れたファイル.js
git commit --amend --no-edit
--no-editをつけると、コミットメッセージはそのままで、ファイルだけを追加できます。
解決方法(パターン2:特定のファイルを取り除きたい)
直前のコミットから特定のファイルだけを除外したい場合の手順です。
# コミットを1つ戻す(ファイルの変更はそのまま、ステージングエリアに戻る)
git reset --soft HEAD^
# 不要なファイルをステージングから外す
git restore --staged config.json
# 再度コミット
git commit -m "機能追加"
各コマンドの意味
-
git reset --soft HEAD^は、コミットだけを取り消して、ファイルの変更は全てステージングエリアに残す -
git restore --stagedは、ステージングエリアから特定のファイルを外す(ファイル自体は変更されたまま)
3. コミット自体をなかったことにしたい
git resetの3つのオプション
Gitのresetには、戻り方によって3種類のオプションがあります。
3-1. git reset --soft(コミットだけ取り消し)
git reset --soft HEAD^
こんな時に使う
- コミットメッセージを変えたい
- もう少しファイルを追加してからコミットしたい
何が起きるか
- コミットの履歴だけが消える
- ファイルの変更はステージングエリアに残る(
git addされた状態のまま) - 作業ディレクトリ(実際のファイル)は変わらない
実行前: [変更したファイル] → [ステージング] → [コミット済み]
実行後: [変更したファイル] → [ステージング] ← ここに戻る
3-2. git reset --mixed(コミットとaddを取り消し)
git reset --mixed HEAD^
# または
git reset HEAD^ # オプション省略時はmixedがデフォルト
こんな時に使う
- どのファイルをコミットするか選び直したい
- 一度ステージングをリセットしたい
何が起きるか
- コミットの履歴が消える
- ステージングエリアもクリアされる
- ファイルの変更内容は残る(
git addする前の状態に戻る)
実行前: [変更したファイル] → [ステージング] → [コミット済み]
実行後: [変更したファイル] ← ここに戻る
3-3. git reset --hard(完全に取り消し)
git reset --hard HEAD^
こんな時に使う
- そのコミットの変更を完全になかったことにしたい
- ファイルの内容も元に戻したい
何が起きるか
- コミットの履歴が消える
- ステージングエリアもクリアされる
- ファイルの変更も全て消える(元の状態に戻る)
実行前: [変更したファイル] → [ステージング] → [コミット済み]
実行後: [元の状態] ← 全て消えてここに戻る
⚠️ 重要な注意点
--hardは、保存していない変更を完全に消去します。実行前に本当に大丈夫か確認してください。一度消すと復元できません(後述のreflogを除く)。
複数のコミットを戻したい場合
# 3つ前のコミットまで戻る
git reset --soft HEAD~3
# 特定のコミットIDまで戻る(git logで確認)
git reset --soft abc1234
コミットIDはgit logで確認できます。
git log --oneline
# abc1234 最新のコミット
# def5678 その前のコミット
# ghi9012 さらに前のコミット
4. 間違えてgit reset --hardしてしまった(最終手段)
状況
git reset --hard HEAD^
# あっ!やっぱり必要だった!消しちゃった!
大丈夫です。まだ間に合います。Gitは削除したように見えるコミットも、実は裏側に保存しています。
git reflogで救済
git reflogは、HEADの移動履歴を記録しているコマンドです。これを使えば、過去のあらゆる状態に戻れます。
# まず履歴を確認
git reflog
実行結果の例
abc1234 HEAD@{0}: reset: moving to HEAD^
def5678 HEAD@{1}: commit: 重要な機能の追加
ghi9012 HEAD@{2}: commit: バグ修正
読み方
-
HEAD@{0}は現在の状態(reset直後) -
HEAD@{1}は1つ前の状態(reset前) -
HEAD@{2}は2つ前の状態
戻したい状態に復元
# HEAD@{1}の状態に戻す
git reset --hard HEAD@{1}
これで、間違って削除したコミットが復活します。
もっと前に戻りたい場合
# 5つ前の状態を確認
git show HEAD@{5}
# 問題なければ戻す
git reset --hard HEAD@{5}
git reflogの便利なポイント
- ブランチの切り替え履歴も残る
-
git commitした内容なら、ほぼ何でも復元できる - ローカルリポジトリにのみ存在(他の人には見えない)
注意点
- reflogは通常90日間保存されます
- コミットしていない変更は復元できません
- あくまでも「最終手段」として覚えておきましょう
5. すでにプッシュしてしまった場合
ローカルだけの問題ならresetでOK
まだgit pushしていない場合は、上記のgit resetを使えば問題ありません。
プッシュ済みの場合はrevertを使う
チームで開発している場合や、すでにリモートリポジトリにプッシュした後は、git resetを使ってはいけません。他の人の作業に影響が出てしまいます。
代わりにgit revertを使います。
# 直前のコミットを打ち消す新しいコミットを作る
git revert HEAD
resetとrevertの違い
| コマンド | 動作 | 履歴 | 使いどころ |
|---|---|---|---|
git reset |
コミットを削除 | 履歴から消える | プッシュ前 |
git revert |
打ち消すコミットを追加 | 履歴に残る | プッシュ後 |
revertの仕組み
元のコミット: A → B → C(間違い)
revertで追加: A → B → C → D(Cを打ち消す内容)
Cのコミットは履歴に残りますが、Dのコミットでその変更を打ち消します。
特定のコミットをrevertする
# 特定のコミットIDを指定
git revert abc1234
# 複数のコミットを一度に打ち消す
git revert HEAD~3..HEAD
revertを取り消したい場合
revert自体もコミットなので、さらにrevertできます。
# 直前のrevertを取り消す
git revert HEAD
6. まとめ(状況別フローチャート)
状況1:コミットメッセージだけ直したい
git commit --amend -m "新しいメッセージ"
状況2:ファイルを追加したい
git add 追加したいファイル
git commit --amend --no-edit
状況3:コミット直前の状態に戻したい(変更は残す)
git reset --soft HEAD^
状況4:ステージングをやり直したい
git reset HEAD^ # または git reset --mixed HEAD^
状況5:コミットを完全になかったことにしたい
git reset --hard HEAD^
状況6:間違えて削除してしまった
git reflog
git reset --hard HEAD@{n} # nは戻りたい番号
状況7:すでにプッシュしてしまった
git revert HEAD
困った時のチェックリスト
まず確認すること
# 現在の状態を確認
git status
# コミット履歴を確認
git log --oneline
# 何を変更したか確認
git diff
プッシュしたかどうかを確認
git log origin/main..HEAD
# 何も表示されない → プッシュ済み
# コミットが表示される → まだプッシュしていない
よくある質問
Q1: resetとrevertはどう使い分けるの?
A: プッシュ前ならreset、プッシュ後ならrevertです。チームで作業している場合は特に注意してください。
Q2: git reset --hardで消した変更は本当に復元できないの?
A: コミットしていればgit reflogで復元できます。ただし、コミットしていない変更やステージングしていない変更は復元できません。
Q3: 複数のコミットをまとめて取り消したい場合は?
A: git reset --soft HEAD~3のように、数字を指定すればまとめて戻せます。
Q4: 間違えてmainブランチにコミットしちゃった
A: 以下の手順でブランチを作り直せます。
# 現在のコミットを基に新しいブランチを作成
git branch feature-branch
# mainブランチのHEADを1つ前に戻す
git reset --hard HEAD^
# 新しいブランチに移動
git checkout feature-branch
最後に
Gitは最初は難しく感じるかもしれませんが、基本的なパターンを覚えれば大丈夫です。この記事で紹介したコマンドを覚えておけば、ほとんどのミスは解決できます。
大事なポイント
- プッシュ前なら
reset、プッシュ後ならrevert - 困ったら
git statusとgit logで状況確認 - 最終手段は
git reflog -
--hardは慎重に使う
何か困ったことがあったら、まずはgit statusで状況を確認して、この記事を見返してみてください。必ず解決策が見つかるはずです。
安心してGitを使って、開発を楽しんでください!