git revertでコミットを取り消す方法:PR単位のrevertまで解説
git revert は、コミットの内容を打ち消す新しいコミットを作るコマンドです。
git reset のように履歴を書き換えないため、すでに push 済みのブランチでも安全に使えます。障害対応でマージした PR を丸ごと取り消したいときにも使えます。
git revert と git reset の違い
| コマンド | 履歴の扱い | push 済みでも使える |
|---|---|---|
git revert |
打ち消すコミットを追加 | ◯ |
git reset |
履歴自体を書き換える | △(force push が必要) |
共有ブランチ(main / develop など)では git revert を使うのが原則です。
直前のコミットを取り消す
最も基本的な使い方です。
git revert HEAD
エディタが開いてコミットメッセージを確認できます。そのまま保存すると "Revert "元のメッセージ"" というコミットが作られます。
エディタを開かずに自動でコミットするには --no-edit を使います。
git revert HEAD --no-edit
実行後のログ:
$ git log --oneline c8cfa97 Revert "add b" 0a22f22 add b ← 取り消し対象(ログには残る) 036e604 add a 27466d9 initial
特定のコミットを取り消す
直前ではなく、過去の任意のコミットを取り消したいときはハッシュを指定します。
git log --oneline # 例: # 0a22f22 add b # 036e604 add a ← これを取り消したい git revert 036e604 --no-edit
add a の内容だけを打ち消すコミットが追加されます(その後の add b は残ります)。
複数コミットをまとめて取り消す
git revert HEAD~2..HEAD --no-edit
HEAD~2..HEAD は「HEAD の2つ前(含まず)から HEAD(含む)まで」の範囲です。新しいコミットから順番に revert コミットが作られます。
PR 単位で revert する(障害対応)
マージコミット(PR のマージ)を revert するには -m 1 オプションが必要です。
なぜ -m 1 が必要か
マージコミットには2つの親があります。
feature branch
↓
aa4e6e4 Merge pull request #1 ← 親1: main、親2: feature
7c8bc59 initial (main)
45c336d add feature (feature)
-m 1 は「親1(main ブランチ側)を正とみなして revert する」という指定です。通常は -m 1 で問題ありません。
手順
# マージコミットのハッシュを確認 git log --oneline # 例:aa4e6e4 Merge pull request #1 from feature # revert(マージコミットのハッシュを指定) git revert -m 1 aa4e6e4 --no-edit
実行後:
$ git log --oneline 1d47fce Revert "Merge pull request #1 from feature" aa4e6e4 Merge pull request #1 from feature 7c8bc59 initial
PR でマージされた変更がすべて取り消されます。
GitHub での手順(PR ベースの障害対応フロー)
# 1. main の最新を取得 git fetch origin git checkout main git pull origin main # 2. revert 用のブランチを作成 git checkout -b revert/pr-1 # 3. マージコミットのハッシュを確認 git log --oneline origin/main | head -5 # 4. revert コミットを作成 git revert -m 1 <merge-commit-hash> --no-edit # 5. push して PR を作成 git push origin revert/pr-1 gh pr create --title "Revert PR #1" --body "障害対応のため #1 を revert"
コンフリクトが発生した場合
revert 中にコンフリクトが起きた場合は以下の手順で解消します。
# コンフリクトしているファイルを修正後 git add <ファイル> git revert --continue
revert をやめたい場合は:
git revert --abort
まとめ
| 操作 | コマンド |
|---|---|
| 直前のコミットを取り消す | git revert HEAD |
| 特定のコミットを取り消す | git revert <hash> |
| 複数コミットをまとめて取り消す | git revert HEAD~n..HEAD |
| マージコミット(PR)を取り消す | git revert -m 1 <merge-commit> |
| エディタを省略 | --no-edit を追加 |
| コンフリクト解消後に続行 | git revert --continue |
| 途中でキャンセル | git revert --abort |
コミット履歴の操作には「git log でコミット履歴を検索する方法」も参考にしてください。