「あっ、間違えてコミットしちゃった…」
Gitを使っていると、こんな場面に必ず遭遇しますよね。
でも安心してください!Gitには「コミットを取り消す」ための方法がいくつも用意されています。
今回は、状況に応じて使い分ける「コミット取り消し」の方法を、初心者の方にも分かりやすく徹底解説していきます!
コミット取り消しの基本:3つの方法

Gitでコミットを取り消す方法は、大きく分けて3つあります。
1. git reset(履歴ごと巻き戻す)
使いどころ: まだpushしていないローカルのコミットを取り消したい時
コミット自体を履歴から削除します。いわば「なかったこと」にする方法です。
2. git revert(打ち消すコミットを新たに作る)
使いどころ: すでにpushしたコミットを取り消したい時
コミット履歴は残したまま、変更を打ち消す新しいコミットを作ります。
3. git commit –amend(直前のコミットを修正)
使いどころ: 直前のコミットをちょっと修正したい時
最後のコミットメッセージやファイルの追加漏れを修正できます。
それぞれ詳しく見ていきましょう!
git reset:コミットを「なかったこと」にする
git resetは、コミット履歴そのものを巻き戻すコマンドです。
resetには3つのモードがある
git resetには、どこまで取り消すかを決める3つのモードがあります。
1. –soft(コミットだけ取り消す)
git reset --soft HEAD~1
何が起こる?
- コミットは取り消される
- ファイルの変更はステージング(git add済み)の状態で残る
- すぐに再コミットできる
こんな時に便利:
- コミットメッセージを間違えた
- コミットに含めるファイルを間違えた
- コミットをやり直したい
例: コミットメッセージを修正したい場合
# 間違ったコミットメッセージでコミットしてしまった
git commit -m "バクを修正" # あれ、「バグ」だった...
# コミットを取り消す(ファイルはステージング状態のまま)
git reset --soft HEAD~1
# 正しいメッセージで再コミット
git commit -m "バグを修正"
2. –mixed(コミットとステージングを取り消す)デフォルト
git reset --mixed HEAD~1
# または
git reset HEAD~1 # --mixedは省略可能
何が起こる?
- コミットは取り消される
- ファイルはステージングから外れる(git add前の状態)
- ファイルの変更内容は残っている
こんな時に便利:
- コミット前にもう少し修正したい
- ステージングからやり直したい
例: コミットしたけど、もう少し編集したい場合
# コミットを取り消してファイルを編集可能な状態に戻す
git reset HEAD~1
# ファイルを追加編集
# その後、再度git add → git commit
3. –hard(すべて完全に取り消す)
git reset --hard HEAD~1
何が起こる?
- コミットは取り消される
- ステージングも取り消される
- ファイルの変更内容も完全に削除される
⚠️ 警告: 作業内容が完全に消えます。使う前に本当に削除していいか確認してください!
こんな時に便利:
- 作業内容ごと完全にリセットしたい
- 間違った作業を丸ごと削除したい
例: 実験的な変更を完全に削除したい場合
# 完全にリセット(取り消せないので注意!)
git reset --hard HEAD~1
複数のコミットをまとめて取り消す
直前のコミットだけでなく、複数のコミットをまとめて取り消すこともできます。
# 直前のコミット
git reset HEAD~1
# 2つ前のコミットまで戻す
git reset HEAD~2
# 3つ前のコミットまで戻す
git reset HEAD~3
# 特定のコミットまで戻す(コミットハッシュを指定)
git reset abc1234
HEAD~1は「HEADから1つ前」という意味です。数字を変えれば、何個前でも指定できます。
現在のコミット履歴を確認する
どこまで戻すか決めるには、まず履歴を確認しましょう。
# シンプルな履歴表示
git log --oneline
結果の例:
a1b2c3d (HEAD -> main) 3回目のコミット
e4f5g6h 2回目のコミット
i7j8k9l 1回目のコミット
左側の英数字(a1b2c3dなど)がコミットハッシュです。これを使って特定のコミットまで戻れます。
git revert:履歴を残したまま打ち消す
git revertは、指定したコミットの変更を打ち消す新しいコミットを作ります。
resetとrevertの決定的な違い
git reset: 履歴から消す(タイムマシンで過去に戻る)
git revert: 打ち消すコミットを追加(新しい履歴として記録)
図で表すとこんな感じです:
【git resetの場合】
A → B → C → D
↓ reset
A → B (Cとは消える)
【git revertの場合】
A → B → C → D
↓ revert
A → B → C → D → E(Cを打ち消すコミット)
いつrevertを使うべき?
重要な判断基準:そのコミットをpushしたか?
- pushしていない →
git resetでOK - pushした →
git revertを使うべき
なぜなら、pushしたコミットをgit resetで削除すると、他の人が混乱してしまうからです。
revertの使い方
直前のコミットを打ち消す
git revert HEAD
実行すると、エディタが開いてコミットメッセージを編集できます。そのままで良ければ保存して閉じましょう。
特定のコミットを打ち消す
# コミット履歴を確認
git log --oneline
# 特定のコミットを打ち消す
git revert abc1234
エディタを開かずにrevertする
# デフォルトのメッセージで自動的にコミット
git revert --no-edit HEAD
複数のコミットを打ち消す
# 範囲を指定して打ち消す
git revert HEAD~3..HEAD
# または一つずつ実行
git revert HEAD~2
git revert HEAD~1
git revert HEAD
revertのコミットをまとめる
複数のコミットを打ち消す時、それぞれコミットを作るのではなく、まとめて1つのコミットにすることもできます。
# コミットせずにステージングだけする
git revert --no-commit HEAD~2
git revert --no-commit HEAD~1
git revert --no-commit HEAD
# まとめてコミット
git commit -m "HEAD~2からHEADまでの変更を打ち消し"
git commit –amend:直前のコミットを修正

「あっ、ファイル追加し忘れた!」「コミットメッセージのタイポ!」
そんな時はgit commit --amendが便利です。
コミットメッセージだけ修正する
# 直前のコミットメッセージを修正
git commit --amend
エディタが開くので、メッセージを編集して保存すればOKです。
コマンドラインで直接指定することもできます:
git commit --amend -m "新しいコミットメッセージ"
ファイルを追加してコミットし直す
# ファイルを編集・追加
git add 忘れてたファイル.txt
# 直前のコミットに含める
git commit --amend --no-edit
--no-editオプションを付けると、コミットメッセージはそのままでファイルだけ追加されます。
amendの注意点
⚠️ すでにpushしたコミットをamendすると問題が発生します!
amendはコミットのハッシュ値を変更するため、pushした後にamendすると、ローカルとリモートの履歴が食い違ってしまいます。
原則: pushする前にだけamendを使いましょう。
もしpush後にamendしてしまったら、強制プッシュが必要になります(後述)。
pushしたコミットを取り消す場合の注意点
「間違ったコミットをpushしちゃった…」
こんな時の対処法を見ていきましょう。
基本方針:revertを使う
すでにpushしたコミットを取り消す場合は、git revertを使うのが安全です。
# 間違ったコミットを打ち消す
git revert abc1234
# リモートに反映
git push origin main
これなら履歴を書き換えないので、チームメンバーに迷惑をかけません。
resetした後に強制プッシュする方法(非推奨)
どうしてもresetで履歴を削除したい場合は、強制プッシュが必要です。
# ローカルでリセット
git reset --hard HEAD~1
# 強制プッシュ
git push -f origin main
# または
git push --force origin main
⚠️ 重要な警告:
強制プッシュは非常に危険です:
- 他の人の作業に影響を与える
- チーム全体の履歴が壊れる可能性がある
- データを失う危険性がある
使っていい条件:
- 自分だけが使っているブランチ
- チームメンバー全員の了承を得ている
- 他に方法がない緊急時のみ
基本的には、pushした後はrevertを使うようにしましょう!
git reflog:間違えた時の救世主
「git reset –hardで消しちゃった…もう戻せない?」
大丈夫です!git reflogがあれば、ほとんどの場合復元できます。
reflogとは?
git reflogは、Gitのすべての操作履歴を記録しているコマンドです。
コミット、リセット、チェックアウト、マージ…すべての操作が記録されています。
reflogの見方
git reflog
結果の例:
a1b2c3d HEAD@{0}: reset: moving to HEAD~1
d4e5f6g HEAD@{1}: commit: 大事なコミット
h7i8j9k HEAD@{2}: commit: 修正作業
l0m1n2o HEAD@{3}: commit: 初期実装
HEAD@{0}:現在の状態(最新)HEAD@{1}:1つ前の操作HEAD@{2}:2つ前の操作
数字が小さいほど新しい操作です。
間違えてresetした時の復元方法
間違えてgit reset --hardしてしまった場合:
# 操作履歴を確認
git reflog
# 例:HEAD@{1}が戻したい状態だった場合
git reset --hard HEAD@{1}
これで、reset前の状態に戻せます!
削除したブランチを復元
# 操作履歴を確認
git reflog
# ブランチが削除される前のコミットを見つけたら
git branch 復元ブランチ名 HEAD@{3}
reflogの有効期限
reflogの記録は永遠には残りません:
- デフォルトで90日間保存
- 到達不可能なコミットは30日間保存
つまり、間違いに気づいたら早めに対処しましょう!
よくあるトラブルと解決方法
トラブル1:コミットメッセージを間違えた(pushする前)
# 方法1:amendで修正
git commit --amend -m "正しいメッセージ"
# 方法2:resetでやり直し
git reset --soft HEAD~1
git commit -m "正しいメッセージ"
トラブル2:ファイルを追加し忘れてコミットした
# 忘れたファイルを追加
git add 忘れたファイル.txt
# 直前のコミットに含める
git commit --amend --no-edit
トラブル3:間違ったブランチにコミットした
# 現在のブランチ名を確認
git branch
# 正しいブランチに移動(コミットはまだ残っている)
git checkout 正しいブランチ
# 間違ったコミットを持ってくる(コミットハッシュを指定)
git cherry-pick abc1234
# 元のブランチに戻って間違ったコミットを削除
git checkout 間違ったブランチ
git reset --hard HEAD~1
トラブル4:pushしたコミットを取り消したい
# revertで打ち消す(安全)
git revert abc1234
git push origin main
強制プッシュでresetする方法(非推奨):
# ローカルでリセット
git reset --hard HEAD~1
# チームに連絡してから強制プッシュ
git push -f origin main
トラブル5:git reset –hardで消してしまった
# まず落ち着いてreflogを確認
git reflog
# 消す前の状態を見つける(例:HEAD@{1})
git reset --hard HEAD@{1}
トラブル6:複数のコミットをまとめて取り消したい(pushしていない)
# 3つ前のコミットまで戻す
git reset HEAD~3
# ファイルの変更も全部消したい場合
git reset --hard HEAD~3
トラブル7:特定のコミットだけを取り消したい(中間のコミット)
# コミット履歴を確認
git log --oneline
# 特定のコミットを打ち消す
git revert abc1234
これなら、中間のコミットだけをピンポイントで打ち消せます。
状況別:どのコマンドを使うべき?

まだpushしていないコミットを取り消す
状況1:コミットメッセージだけ修正したい
git commit --amend -m "新しいメッセージ"
状況2:ファイルも含めて修正したい
git reset --soft HEAD~1
# ファイルを編集
git add .
git commit -m "修正後のコミット"
状況3:作業内容ごと削除したい
git reset --hard HEAD~1
すでにpushしたコミットを取り消す
基本的にrevertを使う:
git revert HEAD
git push origin main
どうしてもresetしたい場合(危険):
# チームに連絡
git reset --hard HEAD~1
git push -f origin main
間違えてresetしてしまった
git reflog
git reset --hard HEAD@{1}
コミット取り消しのベストプラクティス
1. pushする前に確認する
# コミット前の状態確認
git status
# コミット内容の確認
git diff --staged
# コミット後の履歴確認
git log --oneline
2. 小さくコミットする
大きなコミットよりも、小さく頻繁にコミットする方が、取り消しも簡単です。
3. わかりやすいコミットメッセージを書く
後から履歴を見た時に、何をしたか分かるようにしましょう。
良い例:
git commit -m "ユーザー登録機能のバリデーションを追加"
悪い例:
git commit -m "修正"
git commit -m "wip"
4. 危険な操作の前はバックアップを取る
重要な作業をする前は、ブランチを作ってバックアップしておくと安心です。
# 現在の状態をバックアップ
git branch backup-20241211
# 作業する
git reset --hard HEAD~3
# もし問題があれば
git checkout backup-20241211
5. チーム開発では特に慎重に
- 共有ブランチで
git resetを使わない - 強制プッシュは避ける
- 取り消す前にチームに相談する
まとめ:コミット取り消しの判断フローチャート
最後に、どのコマンドを使えばいいかの判断フローをまとめます。
ステップ1:pushしたかどうか?
→ pushしていない
- コミットメッセージだけ修正 → git commit --amend
- ファイルも修正したい → git reset --soft HEAD~1
- 作業内容ごと削除 → git reset --hard HEAD~1
→ pushした
- 基本的に → git revert HEAD
- 緊急時のみ → git reset + git push -f(チームに確認)
ステップ2:間違えた場合
→ git reflogで履歴確認 → git reset --hard HEAD@{N}
覚えておきたいポイント:
- pushする前 →
resetやamendが使える - pushした後 → 基本的に
revertを使う - 間違えた時 →
reflogで復元できる - 迷ったら → まず
git statusとgit logで状態確認
Gitのコミット取り消し、理解していただけましたでしょうか?
最初は難しく感じるかもしれませんが、実際に試してみると意外と簡単です。
練習用のリポジトリを作って、色々な取り消し方を試してみるのがオススメですよ!
間違えても大丈夫。Gitにはreflogという最後の砦があります。
安心して、どんどんコミット&取り消しを試してみてくださいね!

コメント