GitでMerge CommitをRevertする方法

  • 367
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

何個もCommitがあるような一つのPull Requestを全てRevertしたいようなときに使えます。

そもそもRevertとは

あるコミットを打ち消すような、全く逆のコミットを作ることです。
追加した部分を削除して、削除した部分を追加して、変更した部分を変更前の状態にするコミットを作成します。

取り消したいコミットがあるのだけれど、既にリモートにコミットしてしまって、git reset, git rebase -i, git reflogなどを使っての取り消しが不可能なときに使います。

通常のRevert

普通のcommitなら、revertは

$ git revert f60f24d

てな感じで、revertしたいcommit(今回はf60f24d)を指定すれば、実現出来ます。

Merge Commitの場合

ただ、もしf60f24dがMerge Commitだった場合

$ git revert f60f24d
fatal: Commit f60f24d34845fba4e038b3e165f74973b3a19580 is a merge but no -m option was given.

というエラーメッセージが出ます。

これを解決するには

$ git revert -m 1 f60f24d

という風に-m 1と付けるだけです。

念のため確認

念のため、ちゃんと目的のものがrevertされているか確認しましょう。

$ git show

あれ、思っている方と違う方がRevertコミットされている!だめじゃん!!と思ったら、

$ git reset --hard HEAD~

で元の状態に戻して、

$ git revert -m 2 f60f24d

という風に-m 2に変えて試してみましょう。

ちょっと解説

ちなみにこの-m--mainlineの略でparent-numberを指定します。

このparent-numberには基本的に1か2を指定すれば良く、git showをした時に

$ git show f60f24d                              
commit f60f24d34845fba4e038b3e165f74973b3a19580
Merge: 049d32b ebbcb6a
...

と出たとしたら、1は049d32b, 2はebbcb6aを指します。

参考