Git

マージコミットをrevertする方法【git revert merge commit】

マージコミットをrevertしようとしたらエラーが出た...
どうしたらrevertできるの?

読者

通常のコミットと同じようにマージコミットをrevertするとエラーが発生してrevertできませんよね。
もちろんマージコミットもrevertすることはできるのですが、追加でオプションを指定してやる必要があります。

本記事ではそのオプションを使用してマージコミットをrevertする方法について解説していきます。
この方法を知っておけば基本的にrevertで困ることは無くなるので、是非最後までお読みいただければと思います!

この記事で分かること

  • そもそもrevertとは
  • 基本的なrevertの使い方
  • マージコミットを revert する方法とコマンドの意味

環境

  • Git 2.37.2

【結論】マージコミットをrevertする方法

developブランチ(マージ元)→mainブランチ(マージ先)にマージした以下のコミットログを例とします。

コミットログの例

このとき、マージで取り込んだ変更を打ち消したい場合は以下のコマンドでrevertします

git revert -m 1 <マージコミットのコミットID>

このコマンドを実行すると、developブランチの変更であるcommit5が取り消されて、mainブランチがcommit4と同じ状態になります。

ヒロ

基本的にはこちらのコマンドを使うことになると思います!

また、あまりない状況だとは思いますが、逆にマージで取り込んだ変更を残してマージ先で加えていた変更を打ち消したい場合は以下のコマンドでrevertします。

git revert -m 2 <マージコミットのコミットID>

このコマンドを実行すると、mainブランチの変更であるcommit4が取り消されて、mainブランチがdevelopブランチのcommit5と同じ状態になります。

マージコミットのrevert方法は上記の通りですが、ここで出てきた-mオプションや1,2などの数字の意味が分からないと思いますので解説していきます!
復習がてらrevertの基本から解説していくので基本は大丈夫だよ!っていう方は「マージコミットをrevertする方法」まで飛んじゃってください。

そもそもrevertとは

特定のコミットの変更を無かったことにしたいときに使われるコマンドです。

厳密にはコミットのログは残しつつも、逆の変更を加えたrevertコミットを新たに積み上げることで変更を打ち消します

取り消したいコミット
取り消したいコミットの変更内容
revertコミット
revertコミットの変更内容
ヒロ

ちなみにログもろとも完全に削除したい場合はrebase -ireset等を使います!

基本的なrevertの使い方

通常のコミットをrevertしたい場合はgit revertに続けてrevertしたいコミットを指定してやればOKです

コミットの指定方法は、コミットID、HEAD表記のいずれでも問題ありません。

以下のようなコミットログでcommit3をrevertしたい状況を例としてそれぞれ解説していきます。

9cd33ed (HEAD -> main) commit4
680cded commit3
755ffb0 commit2
404c4dc commit1
0f36277 initial commit

revertするコミットをコミットIDで指定する

コミットIDで指定してrevertする場合の書き方は以下の通りです。

git revert <revertしたいコミットのコミットID>

今回の例の場合はこのような感じになります。

git revert 680cded
git revert 680cded2cd322309d56a511d1e9c0ece10065d74

revertするコミットをHEAD表記で指定する

HEAD表記で指定してrevertする場合の書き方も同じ要領です。

git revert <revertしたいコミットのHEAD表記>

今回の例の場合は以下のような感じです。

git revert HEAD^

revertの基本的な使い方について理解できたところで、本題のマージコミットをrevertする方法について見ていきましょう!

以降ではコミットIDを指定する方法で解説していきます。

【解説】マージコミットをrevertする方法

基本的な使い方で解説した通りにマージコミットをrevertしようとすると以下のようなエラーが発生してしまいます。

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

エラーメッセージをよく見ると、-mオプションをつけるように言われていますね。

マージコミットをrevertするにはこの-mオプションを指定する必要があるのですが、まずはこの-mオプションの役割や使い方ついて解説していきます。

マージコミットをrevertする-mオプションとは

-mオプションはマージコミットをrevertするときに使用されるオプションです。

-mオプションの使い方は以下の通りです。

git revert -m <parent-number> <revertしたいマージコミットのコミットID>

-mのmはmainlineのmで、revert際にマージ先とマージ元のどちらの変更を打ち消すのかを指定するためのオプションです。

実際にはparent-numberのところに1か2を指定します。

指定する値と打ち消されるブランチの対応については下の表の通りです。

parent-numberの値打ち消されるブランチ
1マージブランチ
2マージブランチ
parent-numberの値と打ち消されるブランチの対応
ヒロ

マージで取り込んだ内容を打ち消したいのであればparent-numberは1になります!

指定方法についてはこれを見ればOKですが、この1,2という番号が何に対応しているのかだけ解説しておきます。

これはgit log でマージコミットの親コミットの内容を確認すると分かります。

$ git log          
commit ee0bb5bf76ebe58ed23aaacceb4b47dc8db8cb44 (HEAD -> main)
Merge: 9cd33ed 9e5782f
Author: hiroya-akeoka <mowoarm232@gmail.com>
Date:   Mon Jul 24 10:40:37 2023 +0900

    Merge branch 'develop'

commit 9e5782ff7da4599c4eee68cae7859c1ff1b319ac (develop)
Author: hiroya-akeoka <mowoarm232@gmail.com>
Date:   Mon Jul 24 09:55:18 2023 +0900

    commit5

commit 9cd33ed1fcd25e2435927f6dbeb494419577bb3d
Author: hiroya-akeoka <mowoarm232@gmail.com>
Date:   Thu Jul 6 20:42:51 2023 +0900

    commit4

commit 680cded2cd322309d56a511d1e9c0ece10065d74
Author: hiroya-akeoka <mowoarm232@gmail.com>
Date:   Thu Jul 6 18:35:13 2023 +0900

    commit3

commit 755ffb0770ddc6bc043fe60b80007dc773679bd6
Author: hiroya-akeoka <mowoarm232@gmail.com>
Date:   Thu Jul 6 18:34:55 2023 +0900

          ・
          ・
          ・

一番上のログがマージコミットのログですが、 Merge: の後ろに書いてある親コミットに着目します。

9cd33ed 9e5782fと親コミットが2つ並んでいますが、この並び順に対して1,2と内部的に番号が振られています。

1つ目がマージ先ブランチのコミット、2つ目がマージ元ブランチのコミットとなっているので、
マージ元ブランチを打ち消したいならparent-numberは1、マージ先ブランチを打ち消したいならparent-numberは2となります。

実際にマージコミットをrevertする

上記コミットログはdevelopブランチ→mainブランチにマージした状態ですが、
マージコミットの1つ目の親コミット9cd33ed はマージ先ブランチ(mainブランチ)のcommit4を指しているので、マージ元ブランチの変更を打ち消したい場合はparent-numberに1を指定してやります。

git revert -m 1 <revertしたいコミットのコミットID>

2つ目の親コミット9e5782fはマージ元ブランチ(developブランチ)のcommit5を指しているので、マージ先ブランチの変更を打ち消したい場合はparent-numberに2を指定してやります。

git revert -m 2 <revertしたいコミットのコミットID>

まとめ

今回はrevertの基本からマージコミットのrevert方法までを解説してきました。

まとめると、

マージで取り込んだ変更を打ち消したい場合は、

git revert -m 1 <revertしたいコミットのコミットID>

マージで取り込んだ変更を残してマージ先で加えていた変更を打ち消したい場合は、

git revert -m 2 <revertしたいコミットのコミットID>

とすれば良いです。

最後までお読みいただきありがとうございました!

-Git