Gitのコミット取り消し完全ガイド!reset・revert・amendを使い分けよう

git

「あっ、間違えてコミットしちゃった…」

Gitを使っていると、こんな場面に必ず遭遇しますよね。

でも安心してください!Gitには「コミットを取り消す」ための方法がいくつも用意されています。

今回は、状況に応じて使い分ける「コミット取り消し」の方法を、初心者の方にも分かりやすく徹底解説していきます!

スポンサーリンク
  1. コミット取り消しの基本:3つの方法
    1. 1. git reset(履歴ごと巻き戻す)
    2. 2. git revert(打ち消すコミットを新たに作る)
    3. 3. git commit –amend(直前のコミットを修正)
  2. git reset:コミットを「なかったこと」にする
    1. resetには3つのモードがある
    2. 複数のコミットをまとめて取り消す
    3. 現在のコミット履歴を確認する
  3. git revert:履歴を残したまま打ち消す
    1. resetとrevertの決定的な違い
    2. いつrevertを使うべき?
    3. revertの使い方
    4. revertのコミットをまとめる
  4. git commit –amend:直前のコミットを修正
    1. コミットメッセージだけ修正する
    2. ファイルを追加してコミットし直す
    3. amendの注意点
  5. pushしたコミットを取り消す場合の注意点
    1. 基本方針:revertを使う
    2. resetした後に強制プッシュする方法(非推奨)
  6. git reflog:間違えた時の救世主
    1. reflogとは?
    2. reflogの見方
    3. 間違えてresetした時の復元方法
    4. 削除したブランチを復元
    5. reflogの有効期限
  7. よくあるトラブルと解決方法
    1. トラブル1:コミットメッセージを間違えた(pushする前)
    2. トラブル2:ファイルを追加し忘れてコミットした
    3. トラブル3:間違ったブランチにコミットした
    4. トラブル4:pushしたコミットを取り消したい
    5. トラブル5:git reset –hardで消してしまった
    6. トラブル6:複数のコミットをまとめて取り消したい(pushしていない)
    7. トラブル7:特定のコミットだけを取り消したい(中間のコミット)
  8. 状況別:どのコマンドを使うべき?
    1. まだpushしていないコミットを取り消す
    2. すでにpushしたコミットを取り消す
    3. 間違えてresetしてしまった
  9. コミット取り消しのベストプラクティス
    1. 1. pushする前に確認する
    2. 2. 小さくコミットする
    3. 3. わかりやすいコミットメッセージを書く
    4. 4. 危険な操作の前はバックアップを取る
    5. 5. チーム開発では特に慎重に
  10. まとめ:コミット取り消しの判断フローチャート

コミット取り消しの基本:3つの方法

Gitでコミットを取り消す方法は、大きく分けて3つあります。

1. git reset(履歴ごと巻き戻す)

使いどころ: まだpushしていないローカルのコミットを取り消したい時

コミット自体を履歴から削除します。いわば「なかったこと」にする方法です。

2. git revert(打ち消すコミットを新たに作る)

使いどころ: すでにpushしたコミットを取り消したい時

コミット履歴は残したまま、変更を打ち消す新しいコミットを作ります。

3. git commit –amend(直前のコミットを修正)

使いどころ: 直前のコミットをちょっと修正したい時

最後のコミットメッセージやファイルの追加漏れを修正できます。

それぞれ詳しく見ていきましょう!

git reset:コミットを「なかったこと」にする

git resetは、コミット履歴そのものを巻き戻すコマンドです。

resetには3つのモードがある

git resetには、どこまで取り消すかを決める3つのモードがあります。

1. –soft(コミットだけ取り消す)

git reset --soft HEAD~1

何が起こる?

  • コミットは取り消される
  • ファイルの変更はステージング(git add済み)の状態で残る
  • すぐに再コミットできる

こんな時に便利:

  • コミットメッセージを間違えた
  • コミットに含めるファイルを間違えた
  • コミットをやり直したい

例: コミットメッセージを修正したい場合

# 間違ったコミットメッセージでコミットしてしまった
git commit -m "バクを修正"  # あれ、「バグ」だった...

# コミットを取り消す(ファイルはステージング状態のまま)
git reset --soft HEAD~1

# 正しいメッセージで再コミット
git commit -m "バグを修正"

2. –mixed(コミットとステージングを取り消す)デフォルト

git reset --mixed HEAD~1
# または
git reset HEAD~1  # --mixedは省略可能

何が起こる?

  • コミットは取り消される
  • ファイルはステージングから外れる(git add前の状態)
  • ファイルの変更内容は残っている

こんな時に便利:

  • コミット前にもう少し修正したい
  • ステージングからやり直したい

例: コミットしたけど、もう少し編集したい場合

# コミットを取り消してファイルを編集可能な状態に戻す
git reset HEAD~1

# ファイルを追加編集
# その後、再度git add → git commit

3. –hard(すべて完全に取り消す)

git reset --hard HEAD~1

何が起こる?

  • コミットは取り消される
  • ステージングも取り消される
  • ファイルの変更内容も完全に削除される

⚠️ 警告: 作業内容が完全に消えます。使う前に本当に削除していいか確認してください!

こんな時に便利:

  • 作業内容ごと完全にリセットしたい
  • 間違った作業を丸ごと削除したい

例: 実験的な変更を完全に削除したい場合

# 完全にリセット(取り消せないので注意!)
git reset --hard HEAD~1

複数のコミットをまとめて取り消す

直前のコミットだけでなく、複数のコミットをまとめて取り消すこともできます。

# 直前のコミット
git reset HEAD~1

# 2つ前のコミットまで戻す
git reset HEAD~2

# 3つ前のコミットまで戻す
git reset HEAD~3

# 特定のコミットまで戻す(コミットハッシュを指定)
git reset abc1234

HEAD~1は「HEADから1つ前」という意味です。数字を変えれば、何個前でも指定できます。

現在のコミット履歴を確認する

どこまで戻すか決めるには、まず履歴を確認しましょう。

# シンプルな履歴表示
git log --oneline

結果の例:

a1b2c3d (HEAD -> main) 3回目のコミット
e4f5g6h 2回目のコミット
i7j8k9l 1回目のコミット

左側の英数字(a1b2c3dなど)がコミットハッシュです。これを使って特定のコミットまで戻れます。

git revert:履歴を残したまま打ち消す

git revertは、指定したコミットの変更を打ち消す新しいコミットを作ります。

resetとrevertの決定的な違い

git reset: 履歴から消す(タイムマシンで過去に戻る)
git revert: 打ち消すコミットを追加(新しい履歴として記録)

図で表すとこんな感じです:

【git resetの場合】
A → B → C → D
      ↓ reset
A → B (Cとは消える)

【git revertの場合】
A → B → C → D
      ↓ revert
A → B → C → D → E(Cを打ち消すコミット)

いつrevertを使うべき?

重要な判断基準:そのコミットをpushしたか?

  • pushしていないgit resetでOK
  • pushしたgit revertを使うべき

なぜなら、pushしたコミットをgit resetで削除すると、他の人が混乱してしまうからです。

revertの使い方

直前のコミットを打ち消す

git revert HEAD

実行すると、エディタが開いてコミットメッセージを編集できます。そのままで良ければ保存して閉じましょう。

特定のコミットを打ち消す

# コミット履歴を確認
git log --oneline

# 特定のコミットを打ち消す
git revert abc1234

エディタを開かずにrevertする

# デフォルトのメッセージで自動的にコミット
git revert --no-edit HEAD

複数のコミットを打ち消す

# 範囲を指定して打ち消す
git revert HEAD~3..HEAD

# または一つずつ実行
git revert HEAD~2
git revert HEAD~1
git revert HEAD

revertのコミットをまとめる

複数のコミットを打ち消す時、それぞれコミットを作るのではなく、まとめて1つのコミットにすることもできます。

# コミットせずにステージングだけする
git revert --no-commit HEAD~2
git revert --no-commit HEAD~1
git revert --no-commit HEAD

# まとめてコミット
git commit -m "HEAD~2からHEADまでの変更を打ち消し"

git commit –amend:直前のコミットを修正

「あっ、ファイル追加し忘れた!」「コミットメッセージのタイポ!」

そんな時はgit commit --amendが便利です。

コミットメッセージだけ修正する

# 直前のコミットメッセージを修正
git commit --amend

エディタが開くので、メッセージを編集して保存すればOKです。

コマンドラインで直接指定することもできます:

git commit --amend -m "新しいコミットメッセージ"

ファイルを追加してコミットし直す

# ファイルを編集・追加
git add 忘れてたファイル.txt

# 直前のコミットに含める
git commit --amend --no-edit

--no-editオプションを付けると、コミットメッセージはそのままでファイルだけ追加されます。

amendの注意点

⚠️ すでにpushしたコミットをamendすると問題が発生します!

amendはコミットのハッシュ値を変更するため、pushした後にamendすると、ローカルとリモートの履歴が食い違ってしまいます。

原則: pushする前にだけamendを使いましょう。

もしpush後にamendしてしまったら、強制プッシュが必要になります(後述)。

pushしたコミットを取り消す場合の注意点

「間違ったコミットをpushしちゃった…」

こんな時の対処法を見ていきましょう。

基本方針:revertを使う

すでにpushしたコミットを取り消す場合は、git revertを使うのが安全です。

# 間違ったコミットを打ち消す
git revert abc1234

# リモートに反映
git push origin main

これなら履歴を書き換えないので、チームメンバーに迷惑をかけません。

resetした後に強制プッシュする方法(非推奨)

どうしてもresetで履歴を削除したい場合は、強制プッシュが必要です。

# ローカルでリセット
git reset --hard HEAD~1

# 強制プッシュ
git push -f origin main
# または
git push --force origin main

⚠️ 重要な警告:

強制プッシュは非常に危険です:

  • 他の人の作業に影響を与える
  • チーム全体の履歴が壊れる可能性がある
  • データを失う危険性がある

使っていい条件:

  • 自分だけが使っているブランチ
  • チームメンバー全員の了承を得ている
  • 他に方法がない緊急時のみ

基本的には、pushした後はrevertを使うようにしましょう!

git reflog:間違えた時の救世主

「git reset –hardで消しちゃった…もう戻せない?」

大丈夫です!git reflogがあれば、ほとんどの場合復元できます。

reflogとは?

git reflogは、Gitのすべての操作履歴を記録しているコマンドです。

コミット、リセット、チェックアウト、マージ…すべての操作が記録されています。

reflogの見方

git reflog

結果の例:

a1b2c3d HEAD@{0}: reset: moving to HEAD~1
d4e5f6g HEAD@{1}: commit: 大事なコミット
h7i8j9k HEAD@{2}: commit: 修正作業
l0m1n2o HEAD@{3}: commit: 初期実装
  • HEAD@{0}:現在の状態(最新)
  • HEAD@{1}:1つ前の操作
  • HEAD@{2}:2つ前の操作

数字が小さいほど新しい操作です。

間違えてresetした時の復元方法

間違えてgit reset --hardしてしまった場合:

# 操作履歴を確認
git reflog

# 例:HEAD@{1}が戻したい状態だった場合
git reset --hard HEAD@{1}

これで、reset前の状態に戻せます!

削除したブランチを復元

# 操作履歴を確認
git reflog

# ブランチが削除される前のコミットを見つけたら
git branch 復元ブランチ名 HEAD@{3}

reflogの有効期限

reflogの記録は永遠には残りません:

  • デフォルトで90日間保存
  • 到達不可能なコミットは30日間保存

つまり、間違いに気づいたら早めに対処しましょう!

よくあるトラブルと解決方法

トラブル1:コミットメッセージを間違えた(pushする前)

# 方法1:amendで修正
git commit --amend -m "正しいメッセージ"

# 方法2:resetでやり直し
git reset --soft HEAD~1
git commit -m "正しいメッセージ"

トラブル2:ファイルを追加し忘れてコミットした

# 忘れたファイルを追加
git add 忘れたファイル.txt

# 直前のコミットに含める
git commit --amend --no-edit

トラブル3:間違ったブランチにコミットした

# 現在のブランチ名を確認
git branch

# 正しいブランチに移動(コミットはまだ残っている)
git checkout 正しいブランチ

# 間違ったコミットを持ってくる(コミットハッシュを指定)
git cherry-pick abc1234

# 元のブランチに戻って間違ったコミットを削除
git checkout 間違ったブランチ
git reset --hard HEAD~1

トラブル4:pushしたコミットを取り消したい

# revertで打ち消す(安全)
git revert abc1234
git push origin main

強制プッシュでresetする方法(非推奨):

# ローカルでリセット
git reset --hard HEAD~1

# チームに連絡してから強制プッシュ
git push -f origin main

トラブル5:git reset –hardで消してしまった

# まず落ち着いてreflogを確認
git reflog

# 消す前の状態を見つける(例:HEAD@{1})
git reset --hard HEAD@{1}

トラブル6:複数のコミットをまとめて取り消したい(pushしていない)

# 3つ前のコミットまで戻す
git reset HEAD~3

# ファイルの変更も全部消したい場合
git reset --hard HEAD~3

トラブル7:特定のコミットだけを取り消したい(中間のコミット)

# コミット履歴を確認
git log --oneline

# 特定のコミットを打ち消す
git revert abc1234

これなら、中間のコミットだけをピンポイントで打ち消せます。

状況別:どのコマンドを使うべき?

まだpushしていないコミットを取り消す

状況1:コミットメッセージだけ修正したい

git commit --amend -m "新しいメッセージ"

状況2:ファイルも含めて修正したい

git reset --soft HEAD~1
# ファイルを編集
git add .
git commit -m "修正後のコミット"

状況3:作業内容ごと削除したい

git reset --hard HEAD~1

すでにpushしたコミットを取り消す

基本的にrevertを使う:

git revert HEAD
git push origin main

どうしてもresetしたい場合(危険):

# チームに連絡
git reset --hard HEAD~1
git push -f origin main

間違えてresetしてしまった

git reflog
git reset --hard HEAD@{1}

コミット取り消しのベストプラクティス

1. pushする前に確認する

# コミット前の状態確認
git status

# コミット内容の確認
git diff --staged

# コミット後の履歴確認
git log --oneline

2. 小さくコミットする

大きなコミットよりも、小さく頻繁にコミットする方が、取り消しも簡単です。

3. わかりやすいコミットメッセージを書く

後から履歴を見た時に、何をしたか分かるようにしましょう。

良い例:

git commit -m "ユーザー登録機能のバリデーションを追加"

悪い例:

git commit -m "修正"
git commit -m "wip"

4. 危険な操作の前はバックアップを取る

重要な作業をする前は、ブランチを作ってバックアップしておくと安心です。

# 現在の状態をバックアップ
git branch backup-20241211

# 作業する
git reset --hard HEAD~3

# もし問題があれば
git checkout backup-20241211

5. チーム開発では特に慎重に

  • 共有ブランチでgit resetを使わない
  • 強制プッシュは避ける
  • 取り消す前にチームに相談する

まとめ:コミット取り消しの判断フローチャート

最後に、どのコマンドを使えばいいかの判断フローをまとめます。

ステップ1:pushしたかどうか?

pushしていない
  - コミットメッセージだけ修正 → git commit --amend
  - ファイルも修正したい → git reset --soft HEAD~1
  - 作業内容ごと削除 → git reset --hard HEAD~1

pushした
  - 基本的に → git revert HEAD
  - 緊急時のみ → git reset + git push -f(チームに確認)

ステップ2:間違えた場合

git reflogで履歴確認 → git reset --hard HEAD@{N}

覚えておきたいポイント:

  1. pushする前resetamendが使える
  2. pushした後 → 基本的にrevertを使う
  3. 間違えた時reflogで復元できる
  4. 迷ったら → まずgit statusgit logで状態確認

Gitのコミット取り消し、理解していただけましたでしょうか?

最初は難しく感じるかもしれませんが、実際に試してみると意外と簡単です。

練習用のリポジトリを作って、色々な取り消し方を試してみるのがオススメですよ!

間違えても大丈夫。Gitにはreflogという最後の砦があります。

安心して、どんどんコミット&取り消しを試してみてくださいね!

コメント

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