「パスワードをコミットしちゃった!」
「コミットメッセージを間違えた…」
「まだ作業中なのにコミットしてプッシュまでしちゃった!」
Gitを使っていると、誰もが一度は経験する「コミットの取り消し」。でも、状況によって使うコマンドが違うので混乱しますよね。
この記事では、あらゆる状況でのコミット取り消し方法を完全網羅。「まだプッシュしていない」「もうプッシュした」「特定のファイルだけ戻したい」など、あなたの状況にピッタリの解決方法が必ず見つかります!
5分後には、あなたのGitの失敗がなかったことになっているはずです。
まず確認!あなたの状況はどれ?

状況別クイック診断
質問1:プッシュした?
- まだ → ローカルでの対処でOK
- もう → リモートも考慮が必要
質問2:他の人も使ってる?
- 自分だけ → 自由に修正可能
- チーム開発 → 慎重な対応が必要
質問3:何を取り消したい?
- 直前のコミット → 簡単
- 複数のコミット → 少し複雑
- 特定のコミット → 要注意
あなたの状況が分かったら、該当する解決方法へジャンプしてください!
ケース1:直前のコミットを取り消す(まだプッシュしていない)
方法1:コミットを完全になかったことにする(reset –hard)
使う場面:
- 完全に間違えたコミット
- 最初からやり直したい
- 変更内容も全部消していい
コマンド:
git reset --hard HEAD~1
何が起こる?
- コミットが消える
- ファイルの変更も消える
- 完全に1つ前の状態に戻る
注意: 変更内容が完全に消えます!大事な変更がある場合は使わないで!
方法2:コミットだけ取り消す(reset –soft)
使う場面:
- コミットのタイミングを間違えた
- もっと変更を追加したい
- コミットメッセージを変えたい
コマンド:
git reset --soft HEAD~1
何が起こる?
- コミットは取り消される
- 変更はステージング状態で残る
- すぐに再コミット可能
方法3:コミットもステージングも取り消す(reset –mixed)
使う場面:
- コミットを取り消したい
- ファイルを選び直してコミットしたい
- デフォルトの動作
コマンド:
git reset HEAD~1
# または
git reset --mixed HEAD~1
何が起こる?
- コミットが取り消される
- 変更は残るがステージングは解除
- ファイルを選んで再度add可能
ケース2:コミットメッセージだけ修正したい
直前のコミットメッセージを変更
超簡単な方法:
git commit --amend -m "新しいコミットメッセージ"
エディタで編集したい場合:
git commit --amend
エディタが開くので、メッセージを編集して保存。
ファイルの追加忘れも一緒に修正
手順:
# 忘れたファイルをステージング
git add 忘れたファイル.txt
# 前のコミットに含める
git commit --amend --no-edit
--no-edit
オプションでメッセージは変更せずにファイルだけ追加できます。
ケース3:もうプッシュしちゃった!(個人開発)
強制プッシュで解決(force push)
注意: 個人開発や自分だけのブランチでのみ使用!
手順:
# ローカルでコミットを取り消し
git reset --hard HEAD~1
# 強制的にプッシュ
git push --force
# または安全な強制プッシュ
git push --force-with-lease
–force-with-leaseって何?
通常のforce:
- 問答無用で上書き
- 他人の変更も消す可能性
- 危険度:高
force-with-lease:
- 他に変更がないか確認してから上書き
- より安全
- 推奨される方法
ケース4:チーム開発でプッシュ済み(revertを使う)
安全にコミットを打ち消す
なぜrevert?
- 履歴を書き換えない
- 他のメンバーに影響しない
- 取り消しの記録が残る
コマンド:
# 直前のコミットを打ち消す
git revert HEAD
# 特定のコミットを打ち消す
git revert <コミットハッシュ>
複数のコミットをまとめてrevert
範囲指定:
# 最新3つのコミットを打ち消す
git revert HEAD~3..HEAD
# マージコミットなしで打ち消す
git revert HEAD~3..HEAD --no-commit
git commit -m "Revert last 3 commits"
ケース5:特定のファイルだけ元に戻したい
特定ファイルを前のバージョンに戻す
コミット前(ワーキングディレクトリ):
# 特定ファイルの変更を破棄
git checkout -- ファイル名.txt
# 全ファイルの変更を破棄
git checkout -- .
コミット後:
# 特定のコミットの状態に戻す
git checkout <コミットハッシュ> -- ファイル名.txt
# 1つ前のコミットの状態に戻す
git checkout HEAD~1 -- ファイル名.txt
より新しい方法(Git 2.23以降)
# ファイルの変更を破棄
git restore ファイル名.txt
# ステージングから外す
git restore --staged ファイル名.txt
# 特定のコミットから復元
git restore --source=HEAD~1 ファイル名.txt
ケース6:マージを取り消したい
マージ直後(まだプッシュしていない)
# マージを取り消す
git reset --hard HEAD~1
# またはマージ前の状態に戻る
git reset --hard ORIG_HEAD
マージ済みでプッシュ済み
# マージコミットをrevert
git revert -m 1 <マージコミットのハッシュ>
-m 1
は親ブランチを指定(通常は1でOK)
高度なテクニック:インタラクティブrebase
過去の複数コミットを編集
使い道:
- コミット履歴をきれいにする
- 複数のコミットをまとめる
- 過去のコミットメッセージを変更
コマンド:
# 直近3つのコミットを編集
git rebase -i HEAD~3
rebaseエディタの使い方
pick abc1234 最初のコミット
pick def5678 2番目のコミット
pick ghi9012 3番目のコミット
# コマンド:
# p, pick = コミットを使用
# r, reword = コミットメッセージを編集
# e, edit = コミットを修正
# s, squash = 前のコミットと結合
# f, fixup = squashと同じだがメッセージ破棄
# d, drop = コミットを削除
実例:コミットをまとめる
pick abc1234 機能Aを追加
squash def5678 機能Aのバグ修正
squash ghi9012 機能Aのテスト追加
これで3つのコミットが1つにまとまります!
緊急事態!間違えて機密情報をコミットした
完全に履歴から削除する方法
警告: これは劇薬です。チーム全員の協力が必要。
BFG Repo-Cleanerを使う(推奨):
# BFGをダウンロード
# https://rtyley.github.io/bfg-repo-cleaner/
# パスワードファイルを削除
java -jar bfg.jar --delete-files passwords.txt
# 履歴をクリーンアップ
git reflog expire --expire=now --all
git gc --prune=now --aggressive
filter-branchを使う(従来の方法)
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch パスワード.txt" \
--prune-empty --tag-name-filter cat -- --all
重要: 削除後は必ず全員に通知し、force pushが必要です。
よくあるトラブルと解決法
エラー:「Your branch is behind…」
原因: リモートとローカルが食い違っている
解決:
# リモートの最新を取得
git fetch origin
# 強制的に合わせる(注意!)
git reset --hard origin/main
エラー:「Cannot rebase: You have unstaged changes」
原因: 未コミットの変更がある
解決:
# 一時的に退避
git stash
# rebaseなどの操作
# 退避した変更を戻す
git stash pop
HEAD~1って何?HEADˆ1との違いは?
HEAD~n: n個前のコミット
HEAD^n: n番目の親(マージコミットで使用)
通常はHEAD~1
を使えばOK!
ベストプラクティス:失敗を防ぐ方法
コミット前の確認習慣
必ずやること:
# 何が変更されているか確認
git status
# 差分を確認
git diff
# ステージングされた内容を確認
git diff --staged
安全なブランチ運用
ルール:
- mainブランチに直接コミットしない
- 作業は必ずfeatureブランチで
- プルリクエストでレビュー
- マージ前にテスト
.gitignoreの活用
# 機密ファイルを最初から追跡しない
echo "passwords.txt" >> .gitignore
echo ".env" >> .gitignore
echo "*.key" >> .gitignore
よくある質問
Q1. resetとrevertどっちを使うべき?
A. 状況によります:
- 個人開発・プッシュ前 → reset
- チーム開発・プッシュ後 → revert
- 迷ったらrevertが安全
Q2. 取り消しを取り消したい!
A. reflogで復活できます:
# 操作履歴を確認
git reflog
# 特定の状態に戻る
git reset --hard HEAD@{2}
Q3. コミットのハッシュ値はどこで確認?
A. git logで確認:
# シンプルな表示
git log --oneline
# グラフィカルな表示
git log --graph --oneline --all
Q4. SourceTreeやVSCodeでもできる?
A. はい!GUIツールでも可能:
- SourceTree:履歴で右クリック→リセット
- VSCode:Source Controlパネルで操作
- GitHub Desktop:History→Revert
まとめ:もうGitのコミットは怖くない!
これで、あらゆる状況でのコミット取り消し方法をマスターしました!
覚えておくべき基本コマンド:
- git reset – ローカルでの取り消し
- git revert – 安全な取り消し
- git commit –amend – 直前の修正
- git restore – ファイル単位の復元
- git reflog – 最後の救世主
状況別の使い分け:
- ✅ プッシュ前 → reset を使う
- ✅ プッシュ後 → revert を使う
- ✅ チーム開発 → 絶対に revert
- ✅ メッセージだけ → amend
- ✅ やばい時 → reflog で復活
今日から実践:
- ✅ コミット前に必ず
git diff
で確認 - ✅ .gitignoreを適切に設定
- ✅ この記事をブックマーク
- ✅ 失敗を恐れずGitを使う
最後のアドバイス:
Gitの失敗は誰にでもあります。大切なのは、適切な対処方法を知っていること。この記事があれば、もう怖いものなし!
失敗は成長のチャンス。どんどんコミットして、どんどん学んでいきましょう!
コメント