「やばい、間違ったファイルをコミットしちゃった…」
「パスワードが入ったファイルをpushしてしまった!」
「コミットメッセージを間違えた…」
Gitを使っていて、こんな冷や汗をかいた経験ありませんか?
大丈夫です!Gitにはコミットを取り消す様々な方法があり、ほとんどの間違いは修正できます。ただし、状況に応じて適切な方法を選ばないと、チームに迷惑をかけることも…
この記事を読めば、ローカルのコミット取り消しから、プッシュ済みのコミットの対処まで、すべての方法が分かります。もう間違いを恐れることはありません!
状況別!最適な取り消し方法の選び方

まず確認:プッシュ済み?未プッシュ?
取り消し方法を選ぶ最重要ポイントです。
フローチャートで判断:
コミットをプッシュした?
├─ NO(ローカルのみ)
│ ├─ 直前のコミットだけ?
│ │ ├─ 内容も取り消す → git reset --hard HEAD~
│ │ └─ 内容は残す → git reset --soft HEAD~
│ └─ 複数のコミット → git reset で適切な位置まで戻る
│
└─ YES(プッシュ済み)
├─ 個人ブランチ?
│ ├─ YES → git reset + force push(要注意)
│ └─ NO → git revert(安全)
└─ 共有ブランチ → 絶対にgit revert!
方法1:直前のコミットを取り消す(未プッシュ)
git reset –soft(変更内容を残す)
コミットだけ取り消して、変更はステージングエリアに残します。
使用例:
# 直前のコミットを取り消し(変更は残る)
git reset --soft HEAD~
# または
git reset --soft HEAD^
# 確認
git status
# Changes to be committed: として変更が残っている
使いどころ:
- コミットメッセージを変えたい
- コミットをまとめ直したい
- ファイルを追加し忘れた
git reset –hard(変更内容も削除)
コミットも変更も完全に取り消します。危険!
使用例:
# 直前のコミットと変更を完全に削除
git reset --hard HEAD~
# 確認
git status
# nothing to commit, working tree clean
⚠️ 警告:
- 変更内容が完全に消える
- 復元不可能(基本的に)
- 実行前に必ず確認!
git reset –mixed(デフォルト)
コミットを取り消し、変更を作業ディレクトリに戻します。
# 直前のコミットを取り消し(変更は作業ディレクトリに)
git reset HEAD~
# または
git reset --mixed HEAD~
# 確認
git status
# Changes not staged for commit: として変更が残る
方法2:コミットメッセージを修正する
git commit –amend(直前のコミットを修正)
最も頻繁に使う、便利なコマンドです。
メッセージだけ変更:
# コミットメッセージを編集
git commit --amend -m "新しいコミットメッセージ"
# エディタで編集
git commit --amend
ファイルを追加し忘れた場合:
# 忘れたファイルをステージング
git add forgotten_file.txt
# 直前のコミットに含める
git commit --amend --no-edit
実例:
# typoがあるコミット
git commit -m "初回のコミト" # ← typo!
# 修正
git commit --amend -m "初回のコミット"
方法3:プッシュ済みのコミットを取り消す
git revert(安全な取り消し)
新しいコミットを作成して、指定したコミットの変更を打ち消します。
基本的な使い方:
# 直前のコミットをrevert
git revert HEAD
# 特定のコミットをrevert
git revert <commit-hash>
# 複数のコミットをrevert
git revert HEAD~3..HEAD
# マージコミットをrevert
git revert -m 1 <merge-commit-hash>
実例:
# 履歴を確認
git log --oneline
# abc1234 バグを含むコミット
# def5678 正常なコミット
# バグを含むコミットをrevert
git revert abc1234
# プッシュ
git push origin main
メリット:
- 履歴が残る(安全)
- 他の人に影響しない
- いつでも再revert可能
方法4:複数のコミットを取り消す
特定の位置まで戻る
複数のコミットをまとめて取り消します。
コミットハッシュを指定:
# 履歴を確認
git log --oneline
# abc1234 最新のコミット
# def5678 取り消したいコミット3
# ghi9012 取り消したいコミット2
# jkl3456 取り消したいコミット1
# mno7890 ここまで戻りたい
# mno7890まで戻る
git reset --soft mno7890
相対指定:
# 3つ前まで戻る
git reset --soft HEAD~3
# 確認
git log --oneline
インタラクティブリベース(上級者向け)
コミット履歴を細かく編集できます。
# 過去5つのコミットを編集
git rebase -i HEAD~5
# エディタが開く
pick abc1234 コミット1
pick def5678 コミット2
pick ghi9012 コミット3
# 以下のように編集
pick abc1234 コミット1
drop def5678 コミット2 # このコミットを削除
pick ghi9012 コミット3
危険!force pushの正しい使い方
force pushが必要な場面
プッシュ済みのコミットをローカルで変更した場合に必要です。
基本コマンド:
# 通常のforce push(危険)
git push --force origin branch-name
# より安全なforce push
git push --force-with-lease origin branch-name
force pushのルール
絶対に守るべきルール:
- main/masterブランチには絶対にしない
- 他の人が作業している可能性があるブランチには慎重に
- 実行前にチームに連絡
- –force-with-leaseを使う
安全な使用例:
# 自分だけの機能ブランチで
git checkout feature/my-feature
# コミットを整理
git reset --soft HEAD~3
git commit -m "機能の実装をまとめた"
# force push(with-leaseで安全に)
git push --force-with-lease origin feature/my-feature
緊急事態!パスワードをコミットしてしまった
即座に行うべき対応
ステップ1:パスワードを無効化
# まず最優先でパスワード/トークンを無効化!
# GitHub、AWS、データベース等のパスワードを変更
ステップ2:履歴から完全削除
# BFG Repo-Cleanerを使用(推奨)
# 1. BFGをダウンロード
# 2. 実行
java -jar bfg.jar --delete-files passwords.txt
# または git filter-branch(複雑)
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch passwords.txt" \
--prune-empty --tag-name-filter cat -- --all
ステップ3:force push
# すべてのブランチとタグを更新
git push --force --all
git push --force --tags
よくあるトラブルと解決法
トラブル1:間違えてresetしてしまった!
解決:reflogで復元
# reflogで履歴を確認
git reflog
# 例:
# abc1234 HEAD@{0}: reset: moving to HEAD~3
# def5678 HEAD@{1}: commit: 重要なコミット
# 復元
git reset --hard def5678
トラブル2:コンフリクトが発生
revert時のコンフリクト解決:
# revertでコンフリクト
git revert <commit-hash>
# CONFLICT発生
# 手動で解決
# ファイルを編集してコンフリクトマーカーを削除
# 解決したらadd
git add .
# revertを完了
git revert --continue
トラブル3:detached HEAD状態
解決方法:
# 現在の状態を確認
git status
# HEAD detached at abc1234
# ブランチを作成して保存
git checkout -b temp-branch
# または元のブランチに戻る
git checkout main
ベストプラクティス
コミット前のチェックリスト
# 1. 差分を確認
git diff --staged
# 2. 不要なファイルが含まれていないか
git status
# 3. .gitignoreは適切か
cat .gitignore
# 4. センシティブな情報は含まれていないか
git diff --staged | grep -i "password\|secret\|token\|key"
エイリアスで効率化
.gitconfigに追加:
[alias]
# 直前のコミットを修正
amend = commit --amend --no-edit
# 安全なreset
undo = reset --soft HEAD~
# 変更も含めて取り消し(危険)
discard = reset --hard HEAD~
# revertのショートカット
rv = revert
まとめ:もうコミットの間違いは怖くない!
ここまで読んでいただき、ありがとうございました!
状況別クイックリファレンス
ローカルのコミットを取り消す:
git reset --soft HEAD~ # 変更を残す
git reset --hard HEAD~ # 完全に削除
コミットメッセージを修正:
git commit --amend -m "新しいメッセージ"
プッシュ済みを取り消す:
git revert HEAD # 安全
緊急時(パスワード漏洩):
- パスワード無効化
- BFGで履歴削除
- force push
覚えておくべき鉄則
- プッシュ前なら自由に変更OK
- プッシュ後は基本的にrevert
- force pushは最終手段
- mainブランチは特に慎重に
- 困ったらreflogが味方
Gitのコミット取り消しは、正しく理解すれば怖くありません。
この記事の方法を使えば、どんな間違いも適切に対処できます。ただし、チーム開発では事前のコミュニケーションを忘れずに!
安心してコミットできる開発ライフを楽しんでください!🚀
コメント