GitHubコミット取り消し完全ガイド!reset・revert・amendを安全に使い分ける方法

github

「やばい、間違ったファイルをコミットしちゃった…」
「パスワードが入ったファイルを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のルール

絶対に守るべきルール:

  1. main/masterブランチには絶対にしない
  2. 他の人が作業している可能性があるブランチには慎重に
  3. 実行前にチームに連絡
  4. –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  # 安全

緊急時(パスワード漏洩):

  1. パスワード無効化
  2. BFGで履歴削除
  3. force push

覚えておくべき鉄則

  1. プッシュ前なら自由に変更OK
  2. プッシュ後は基本的にrevert
  3. force pushは最終手段
  4. mainブランチは特に慎重に
  5. 困ったらreflogが味方

Gitのコミット取り消しは、正しく理解すれば怖くありません。

この記事の方法を使えば、どんな間違いも適切に対処できます。ただし、チーム開発では事前のコミュニケーションを忘れずに!

安心してコミットできる開発ライフを楽しんでください!🚀

コメント

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