誰もが一度は経験する、Gitでのミス。
「パスワードをコミットしてしまった…」 「コミットメッセージを間違えた…」 「まだ完成してないのにコミットしちゃった…」 「違うブランチにコミットしてしまった…」
大丈夫です。Gitには、あらゆる「やり直し」の方法が用意されています。
この記事では、コミットの取り消し方法を状況別に分かりやすく解説します。「どのコマンドを使えばいいか」が一目で分かるフローチャートも用意しました。
重要な約束:この記事を読めば、データを失うことなく、安全にコミットを取り消せるようになります。
まず理解しよう:Gitの3つのエリア

Gitの基本構造
コミットの取り消しを理解するには、Gitの3つのエリアを知ることが大切です。
作業ディレクトリ → ステージングエリア → リポジトリ
(Working Directory) → (Staging Area) → (Repository)
↑ ↑ ↑
現在の作業場所 git addした場所 git commitした場所
各エリアの役割:
- 作業ディレクトリ(Working Directory)
- 実際にファイルを編集する場所
- あなたが今見ているファイル
- ステージングエリア(Staging Area / Index)
- コミット予定のファイルを置く場所
git add
したファイルが入る
- リポジトリ(Repository)
- コミット履歴が保存される場所
git commit
したデータが入る
状況別フローチャート:どのコマンドを使うべき?
質問:どんな状況ですか?
│
├─ 直前のコミットを修正したい
│ ├─ コミットメッセージだけ変更 → git commit --amend
│ └─ ファイルも修正 → git add → git commit --amend
│
├─ コミットを取り消したい(ローカルのみ)
│ ├─ 変更内容は残したい → git reset --soft または --mixed
│ └─ 変更内容も消したい → git reset --hard
│
├─ すでにプッシュしてしまった
│ ├─ 自分だけが使うブランチ → git push -f (force push)
│ └─ チームで共有 → git revert
│
└─ 特定のファイルだけ戻したい → git checkout または git restore
ケース1:直前のコミットメッセージを修正する
最も簡単なケース:メッセージの誤字を直す
状況:
git commit -m "feture: ログイン機能を追加" # featureのスペルミス!
解決方法:
git commit --amend -m "feature: ログイン機能を追加"
結果:
- コミットメッセージが修正される
- コミットIDは変更される(新しいコミットになる)
- ファイルの内容は変わらない
エディタでじっくり編集する
git commit --amend
# デフォルトエディタが開く(VimやVS Codeなど)
# メッセージを編集して保存
Vimエディタの場合の操作:
1. iキーで編集モード
2. メッセージを修正
3. Escキーで編集モード終了
4. :wq で保存して終了
ケース2:直前のコミットにファイルを追加・修正
ファイルを追加し忘れた場合
状況:
git add index.html
git commit -m "ホームページを作成"
# あっ!style.cssも一緒にコミットするはずだった...
解決方法:
git add style.css
git commit --amend --no-edit
# --no-editオプションでメッセージは変更しない
コミット内容を修正したい場合
状況: デバッグ用のconsole.logを消し忘れた
解決方法:
# 1. ファイルを修正
vim app.js # console.logを削除
# 2. 修正をステージング
git add app.js
# 3. 直前のコミットを上書き
git commit --amend --no-edit
ケース3:コミットを取り消す(3つのreset)
git reset の3つのオプション
オプションによる違い:
オプション | コミット履歴 | ステージング | 作業ディレクトリ | 使用場面 |
---|---|---|---|---|
–soft | 取り消す | 残る | 残る | コミットだけやり直したい |
–mixed | 取り消す | 取り消す | 残る | add からやり直したい(デフォルト) |
–hard | 取り消す | 取り消す | 取り消す | 完全になかったことにしたい |
–soft:コミットだけ取り消す
使用場面: 「コミットしたけど、もう少し修正してからコミットし直したい」
# 直前のコミットを取り消す
git reset --soft HEAD~1
# 状態確認
git status
# Changes to be committed: (ステージングに残っている)
# 追加の修正後、再コミット
git commit -m "改善版:機能を追加"
図解:
実行前: A → B → C (HEAD)
実行後: A → B (HEAD)
Cの変更はステージングエリアに残る
–mixed(デフォルト):コミットとaddを取り消す
使用場面: 「ファイルの選別からやり直したい」
# 直前のコミットを取り消す
git reset HEAD~1
# または
git reset --mixed HEAD~1
# 状態確認
git status
# Changes not staged for commit: (作業ディレクトリに残る)
# 必要なファイルだけ選んでコミット
git add 必要なファイル.txt
git commit -m "必要な変更のみコミット"
–hard:完全に取り消す(危険!)
⚠️ 警告:このコマンドは変更内容を完全に削除します
使用場面: 「このコミットは完全に間違い。なかったことにしたい」
# 実行前に必ず確認!
git log --oneline -5 # 最近の5コミットを表示
# 直前のコミットを完全に削除
git reset --hard HEAD~1
# 2つ前まで戻る場合
git reset --hard HEAD~2
復元方法(もし間違えて実行した場合):
# reflogで履歴を確認
git reflog
# 戻したいコミットのハッシュを指定
git reset --hard <コミットハッシュ>
ケース4:複数のコミットを取り消す
特定のコミットまで戻る
# コミット履歴を確認
git log --oneline
# abc123 最新のコミット
# def456 2つ前のコミット
# ghi789 3つ前のコミット ← ここまで戻りたい
# 指定のコミットまで戻る
git reset --soft ghi789
対話的にコミットを整理する(rebase -i)
複数のコミットをまとめる:
# 直近3つのコミットを編集
git rebase -i HEAD~3
# エディタが開く
pick abc123 コミット1
pick def456 コミット2
pick ghi789 コミット3
# pickをsquashに変更してまとめる
pick abc123 コミット1
squash def456 コミット2
squash ghi789 コミット3
ケース5:プッシュ済みのコミットを取り消す

方法1:git revert(推奨)
安全な方法:取り消しコミットを新規作成
# 直前のコミットを打ち消すコミットを作成
git revert HEAD
# 特定のコミットを打ち消す
git revert <コミットハッシュ>
# 複数のコミットを打ち消す(範囲指定)
git revert HEAD~3..HEAD
# コミットメッセージを編集せずに実行
git revert HEAD --no-edit
メリット:
- 履歴が残る
- チーム開発で安全
- コンフリクトが起きにくい
デメリット:
- 履歴が複雑になる
- 「取り消しの取り消し」が分かりにくい
方法2:force push(危険!)
⚠️ チーム開発では原則禁止
# ローカルでコミットを取り消す
git reset --hard HEAD~1
# 強制的にプッシュ(-fまたは--force)
git push -f origin main
# より安全な force-with-lease を使う
git push --force-with-lease origin main
force-with-leaseの利点:
- 他の人がプッシュしていたら失敗する
- 誤って他人の作業を消すリスクが低い
ケース6:特定のファイルだけ元に戻す
作業中のファイルを前の状態に戻す
# 特定のファイルを直前のコミット時点に戻す
git checkout HEAD -- ファイル名
# または新しいコマンド(Git 2.23以降)
git restore ファイル名
# ステージングから作業ディレクトリに戻す
git restore --staged ファイル名
特定のコミットからファイルを復元
# 特定のコミットの状態に戻す
git checkout <コミットハッシュ> -- ファイル名
# 例:3つ前のコミットの状態に戻す
git checkout HEAD~3 -- index.html
よくある失敗と対処法
失敗1:間違えてreset –hardしてしまった
症状: 作業内容が消えてしまった!
解決方法:
# 1. reflogで履歴を確認
git reflog
# abc123 HEAD@{0}: reset: moving to HEAD~1
# def456 HEAD@{1}: commit: 重要な作業 ← これを復元したい
# 2. 復元
git reset --hard def456
失敗2:違うブランチにコミットした
症状: mainブランチに直接コミットしてしまった
解決方法:
# 1. 正しいブランチを作成(現在の状態で)
git branch feature-branch
# 2. mainブランチを1つ前に戻す
git reset --hard HEAD~1
# 3. 正しいブランチに切り替え
git checkout feature-branch
失敗3:マージコミットを取り消したい
通常のresetでは複雑になるため:
# マージを取り消す
git revert -m 1 <マージコミットのハッシュ>
# -m 1 は「1番目の親(通常はmainブランチ)を残す」という意味
安全に作業するためのベストプラクティス
1. 作業前の確認コマンド
# 現在の状態を確認
git status
# コミット履歴を確認
git log --oneline -10
# 変更内容を確認
git diff
# ブランチを確認
git branch
2. バックアップブランチの作成
# 念のためバックアップブランチを作成
git branch backup-$(date +%Y%m%d-%H%M%S)
# または、タグでマーク
git tag backup-before-reset
3. エイリアスの設定
# よく使うコマンドを短縮
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.undo 'reset --soft HEAD~1'
# 使用例
git unstage ファイル名
git undo # 直前のコミットを取り消し
4. コミット前のチェックリスト
# コミット前に必ず実行
git diff --staged # ステージングの内容確認
git status # 含まれるファイル確認
# 機密情報のチェック
git diff --staged | grep -i "password\|secret\|key\|token"
状況別クイックリファレンス
💡 コミットメッセージを変更
git commit --amend -m "新しいメッセージ"
💡 ファイルを追加し忘れた
git add 忘れたファイル
git commit --amend --no-edit
💡 直前のコミットを取り消す(内容は残す)
git reset --soft HEAD~1
💡 直前のコミットを取り消す(addも取り消す)
git reset HEAD~1
💡 直前のコミットを完全に削除
git reset --hard HEAD~1
💡 プッシュ済みを安全に取り消す
git revert HEAD
git push
💡 特定のファイルだけ戻す
git restore ファイル名
トラブルシューティング Q&A
Q1: reset と revert の使い分けは?
A:
- reset: ローカルの履歴を書き換える(プッシュ前)
- revert: 打ち消しコミットを作る(プッシュ後)
チーム開発では基本的にrevertを使いましょう。
Q2: どこまで戻せますか?
A: git reflog
が残っている限り(通常90日間)、ほぼすべての操作を取り消せます。ただし、git reset --hard
で消した未コミットの変更は復元できません。
Q3: コンフリクトが発生したら?
A:
# revert時のコンフリクト解決
git status # コンフリクトファイルを確認
# ファイルを手動で修正
git add 修正したファイル
git revert --continue
Q4: 間違えて force push してしまった
A: 他のチームメンバーに即座に連絡し、以下を実行してもらう:
git fetch origin
git reset --hard origin/main
Q5: stashとresetの違いは?
A:
- stash: 一時的に変更を退避(後で復元可能)
- reset: コミットを取り消す
作業中の変更を一時的に隠したいだけならgit stash
が安全です。
チートシート:印刷して手元に置こう

# ========== コミットの修正 ==========
git commit --amend # 直前のコミットを修正
git commit --amend -m "新MSG" # メッセージ変更
git commit --amend --no-edit # メッセージそのまま
# ========== リセット(取り消し) ==========
git reset --soft HEAD~1 # コミットのみ取り消し
git reset HEAD~1 # コミット+add取り消し
git reset --hard HEAD~1 # 完全に取り消し
# ========== 安全な取り消し ==========
git revert HEAD # 打ち消しコミット作成
git revert <hash> # 特定コミットを打消し
# ========== ファイル操作 ==========
git restore <file> # ファイルを戻す
git restore --staged <file> # ステージングから除外
# ========== 履歴確認 ==========
git log --oneline -10 # 最近10コミット
git reflog # 操作履歴
git diff --staged # ステージング内容
# ========== 緊急時 ==========
git reflog # 履歴から復元ポイント探す
git reset --hard <hash> # 特定時点に復元
まとめ:恐れずにGitを使いこなそう
Gitでのコミット取り消しは、最初は怖く感じるかもしれません。でも、この記事で学んだ知識があれば、ほとんどのミスは修正可能です。
覚えておくべき重要ポイント:
✅ 用途に応じてコマンドを使い分ける
- 修正なら
--amend
- 取り消しなら
reset
- プッシュ済みなら
revert
✅ resetの3つのオプションを理解する
--soft
: コミットだけ--mixed
: コミット+ステージング--hard
: すべて
✅ 安全対策を忘れない
- 重要な作業前はバックアップ
reflog
があれば復元可能- チーム開発では
revert
を優先
✅ 練習あるのみ
- テストリポジトリで試す
- 失敗を恐れない
- 経験が最高の教師
Gitは強力なツールです。失敗を恐れず、どんどん使って慣れていきましょう。この記事をブックマークして、困ったときの参考にしてください。
Happy Git Life! 🎯
さらに学びたい方へ:
コメント