はじめに
Gitを使っていて「あ、間違えてコミットしちゃった!」という経験はありませんか?
この記事では、git resetを使ったコミット取り消しの方法を、--soft、--mixed、--hardの3つのオプションの違いを含めて解説します。
基本的な流れ
コミットを取り消す際の基本的な流れは以下の通りです。
1. コミット履歴を確認
まず、どのコミットを取り消すのか確認するため、履歴を見てみましょう。
git log --oneline -20
このコマンドで最新20件のコミット履歴が表示されます。
実行例:
a1b2c3d (HEAD -> main) 最新のコミット
e4f5g6h その前のコミット
i7j8k9l さらに前のコミット
...
2. コミットを取り消す
git resetコマンドでコミットを取り消します。ここでは3つのオプションから選択します。
3. 状態を確認
取り消し後、現在の状態を確認します。
git status
reset の3つのオプション
git resetには3つのモードがあり、それぞれ取り消し後の状態が異なります。
パターン1: --soft (一番安全)
特徴: コミットだけを取り消し、変更内容はステージング領域に残る
git reset --soft HEAD~1
どんな時に使う?
- コミットメッセージを書き直したい時
- 複数のコミットを1つにまとめたい時
- コミットはやり直したいが、変更内容は保持したい時
実行後の状態:
git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file1.txt
modified: file2.txt
変更内容がステージング済み(git add済み)の状態になっているので、すぐに再コミット可能です。
パターン2: --mixed (デフォルト)
特徴: コミットとステージングを取り消し、変更内容はワーキングディレクトリに残る
git reset --mixed HEAD~1
# または
git reset HEAD~1 # --mixedはデフォルトなので省略可能
どんな時に使う?
- コミット前の状態に戻って、ファイルを選び直したい時
- 一部のファイルだけ再度ステージングしたい時
-
git addからやり直したい時
実行後の状態:
git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: file1.txt
modified: file2.txt
変更内容は残っていますが、ステージングが解除された状態です。必要に応じてgit addし直せます。
パターン3: --hard (注意が必要)
特徴: コミット、ステージング、変更内容をすべて取り消す
git reset --hard HEAD~1
⚠️ 警告: このコマンドは変更内容を完全に削除します。元に戻せないので慎重に使用してください。
どんな時に使う?
- 変更内容が完全に不要な時
- 前のコミット状態に完全に戻りたい時
- 実験的な変更を全部破棄したい時
実行後の状態:
git status
On branch main
nothing to commit, working tree clean
すべての変更が消え、クリーンな状態になります。
3つのオプションの比較表
| オプション | コミット | ステージング | 変更内容 | 用途 |
|---|---|---|---|---|
--soft |
取り消す | 保持 | 保持 | コミットメッセージの修正 |
--mixed |
取り消す | 取り消す | 保持 | ステージングからやり直し |
--hard |
取り消す | 取り消す | 削除 | 完全にやり直し(注意) |
HEAD~1 の意味
HEAD~1は「現在のコミットから1つ前」を意味します。
-
HEAD~1: 1つ前のコミット -
HEAD~2: 2つ前のコミット -
HEAD~3: 3つ前のコミット
複数のコミットをまとめて取り消したい場合は、数字を変更します。
実践例:コミットメッセージを修正する
# 1. 履歴確認
git log --oneline -20
# 2. 直前のコミットを取り消す(変更は保持)
git reset --soft HEAD~1
# 3. 状態確認
git status
# 4. 正しいメッセージで再コミット
git commit -m "正しいコミットメッセージ"
よくある間違いと対処法
間違えて --hard してしまった場合
すぐであればgit reflogで復旧できる可能性があります。
git reflog
git reset --hard <元のコミットのハッシュ>
リモートにpush済みのコミットを取り消したい場合
すでにリモートにpushしたコミットは、チームメンバーに影響があるため慎重に対応が必要です。
対処法は2つあります。
方法1: revert を使う(推奨)
特徴: 履歴を残したまま、変更内容を打ち消す新しいコミットを作成する
# 1. 履歴確認
git log --oneline
# 2. 取り消したいコミットをrevert
git revert a1b2c3d --no-edit
# 3. 状態確認
git status
# 4. プッシュ
git push origin feature/ブランチ名
メリット:
- 履歴が残るので安全
- チームメンバーに影響が少ない
- 強制pushが不要
いつ使う?
- チームで開発している時(基本的にこちらを推奨)
- main/masterブランチなど、保護されたブランチの場合
方法2: reset + 強制push(慎重に)
特徴: コミット履歴ごと削除して強制的にリモートを書き換える
# 1. 履歴確認
git log --oneline
# 2. ローカルでコミットを削除
git reset --hard HEAD~1
# 3. 状態確認
git status
# 4. 強制push
git push origin feature/ブランチ名 --force
⚠️ 注意点:
- 他の人がそのブランチを使っている場合、コンフリクトが発生する
- 履歴が書き換わるため、チームメンバーの混乱を招く可能性がある
- 実行前に必ずチームに確認する
いつ使う?
- 自分専用のfeatureブランチで、誰も使っていない時
- まだ誰もpullしていない直後の場合
- どうしても履歴をきれいにしたい時(レビュー前など)
2つの方法の比較
| 項目 | revert | reset + force push |
|---|---|---|
| 履歴 | 残る | 消える |
| 安全性 | 高い | 低い |
| チーム開発 | ◎ 推奨 | △ 注意が必要 |
| 使用場面 | 本番・共有ブランチ | 個人ブランチ |
まとめ
ローカルのコミット取り消し
- 迷ったら
--softを使う(一番安全) - ステージングからやり直したいなら
--mixed - 完全に削除したい場合のみ
--hard(慎重に) - まずは
git log --onelineで状況確認 - 実行後は
git statusで状態確認
リモートにpush済みの場合
- 基本的には
revertを使う(履歴を残して安全に取り消し) - 個人ブランチでどうしても履歴を消したい時だけ
reset --hard + --force
Gitのコミット取り消しは慣れれば便利な機能です。最初は--softから始めて、徐々に使い分けられるようになりましょう!
参考リンク
この記事が役に立ったら、いいね♡をお願いします!