Git commitを取り消す!あらゆる状況に対応する完全ガイド

git

「パスワードをコミットしちゃった!」
「コミットメッセージを間違えた…」
「まだ作業中なのにコミットしてプッシュまでしちゃった!」

Gitを使っていると、誰もが一度は経験する「コミットの取り消し」。でも、状況によって使うコマンドが違うので混乱しますよね。

この記事では、あらゆる状況でのコミット取り消し方法を完全網羅。「まだプッシュしていない」「もうプッシュした」「特定のファイルだけ戻したい」など、あなたの状況にピッタリの解決方法が必ず見つかります!

5分後には、あなたのGitの失敗がなかったことになっているはずです。


スポンサーリンク
  1. まず確認!あなたの状況はどれ?
    1. 状況別クイック診断
  2. ケース1:直前のコミットを取り消す(まだプッシュしていない)
    1. 方法1:コミットを完全になかったことにする(reset –hard)
    2. 方法2:コミットだけ取り消す(reset –soft)
    3. 方法3:コミットもステージングも取り消す(reset –mixed)
  3. ケース2:コミットメッセージだけ修正したい
    1. 直前のコミットメッセージを変更
    2. ファイルの追加忘れも一緒に修正
  4. ケース3:もうプッシュしちゃった!(個人開発)
    1. 強制プッシュで解決(force push)
    2. –force-with-leaseって何?
  5. ケース4:チーム開発でプッシュ済み(revertを使う)
    1. 安全にコミットを打ち消す
    2. 複数のコミットをまとめてrevert
  6. ケース5:特定のファイルだけ元に戻したい
    1. 特定ファイルを前のバージョンに戻す
    2. より新しい方法(Git 2.23以降)
  7. ケース6:マージを取り消したい
    1. マージ直後(まだプッシュしていない)
    2. マージ済みでプッシュ済み
  8. 高度なテクニック:インタラクティブrebase
    1. 過去の複数コミットを編集
    2. rebaseエディタの使い方
    3. 実例:コミットをまとめる
  9. 緊急事態!間違えて機密情報をコミットした
    1. 完全に履歴から削除する方法
    2. filter-branchを使う(従来の方法)
  10. よくあるトラブルと解決法
    1. エラー:「Your branch is behind…」
    2. エラー:「Cannot rebase: You have unstaged changes」
    3. HEAD~1って何?HEADˆ1との違いは?
  11. ベストプラクティス:失敗を防ぐ方法
    1. コミット前の確認習慣
    2. 安全なブランチ運用
    3. .gitignoreの活用
  12. よくある質問
    1. Q1. resetとrevertどっちを使うべき?
    2. Q2. 取り消しを取り消したい!
    3. Q3. コミットのハッシュ値はどこで確認?
    4. Q4. SourceTreeやVSCodeでもできる?
  13. まとめ:もう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

安全なブランチ運用

ルール:

  1. mainブランチに直接コミットしない
  2. 作業は必ずfeatureブランチで
  3. プルリクエストでレビュー
  4. マージ前にテスト

.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のコミットは怖くない!

これで、あらゆる状況でのコミット取り消し方法をマスターしました!

覚えておくべき基本コマンド:

  1. git reset – ローカルでの取り消し
  2. git revert – 安全な取り消し
  3. git commit –amend – 直前の修正
  4. git restore – ファイル単位の復元
  5. git reflog – 最後の救世主

状況別の使い分け:

  • プッシュ前 → reset を使う
  • プッシュ後 → revert を使う
  • チーム開発 → 絶対に revert
  • メッセージだけ → amend
  • やばい時 → reflog で復活

今日から実践:

  • ✅ コミット前に必ずgit diffで確認
  • ✅ .gitignoreを適切に設定
  • ✅ この記事をブックマーク
  • ✅ 失敗を恐れずGitを使う

最後のアドバイス:
Gitの失敗は誰にでもあります。大切なのは、適切な対処方法を知っていること。この記事があれば、もう怖いものなし!

失敗は成長のチャンス。どんどんコミットして、どんどん学んでいきましょう!

コメント

タイトルとURLをコピーしました