git revertでコミットを取り消す方法:PR単位のrevertまで解説

スポンサーリンク

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 でコミット履歴を検索する方法」も参考にしてください。