マージしたPRをRevertでなかったことにしたい

1 min read読了の目安(約1400字

概要

何個かPRマージして検証環境で動作確認してたけど
1個のPRにバグが入り込んでて、それだけなかったことにしたい・・・
というケースが仕事であり、初めてやったので忘れないようにメモ残しとく

状態

commit bでa.txtファイルを追加し
GitHub上のPRでマージすることでcommit cのマージコミットが作成された状態

$ git log --graph --all
*   commit c (HEAD -> master, origin/master, origin/HEAD)
|\  Merge: 47cfc85 30143d7
| | Author: xxx <xxxx@example.com>
| | Date:   Sat Apr 24 22:41:02 2021 +0900
| |
| |     Merge pull request #13 from shintaro-uchiyama/test-revert
| |
| |     add a
| |
| * commit b (origin/test-revert, test-revert)
|/  Author: xxx <xxxx@example.com>
|   Date:   Sat Apr 24 22:40:15 2021 +0900
|
|       add a
|
|   A   tmp/a.txt
|
* commit a
| Author: xxx <xxxx@example.com>
| Date:   Sat Apr 24 22:35:03 2021 +0900
|
|     first commit
|

なかったことにする

でも、やっぱりなかったことにしたいのでマージコミットcをrevertしてみる
(cは実際にはハッシュ値に置き換えてやってみてください

$ git revert c
error: commit c is a merge but no -m option was given.
fatal: revert failed

怒られた・・
-mオプションが必要みたい

確かに、cのマージコミットをなかったことにした時
コミットaとコミットbのふたつが残るので、どっちの状態にしたらいいかわからんのじゃい!
っていうことみたい。

1を指定するとマージされた側のブランチの状態にもどす
2を指定するとマージした側のブランチの状態に戻せるみたい

今回のケースで言えばa.txtを追加したPRの内容をなかったことにしたいので1を指定する

$ git revert c -m 1
Removing tmp/a.txt
[test-revert-pr-merge 0117544] Revert "Merge pull request #13 from shintaro-uchiyama/test-revert"
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 tmp/a.txt

これで無事PRの内容がなかったことになったです

まとめ

commitに対してrevertすることは何度もあったけど
PR単位でのrevertってやったことなかった&mオプション必須とか知らなかったので
メモを残しておく🤹‍♂️