🎃

マージコミットをリバートする際に利用する脳死の -m 1 を理解する

に公開

概要

シナリオとして、開発していた機能(ブランチA)を main ブランチにマージしたが、障害が発生して切り戻す必要が出てきて、ブランチAをリバートするという場合が考えられる。
また、GitHubを利用している方は、特に意識しなくても良いかもしれないが、リバートする際にコンフリクトが発生していたら、CLIで解消する必要があるので、git revert コマンドを実行するタイミングが来るはず。
私は、git revert -m 1 <commit>を脳死で実行していたので、改めて調べてみようと思い記事にしてみました。

結論

  • -m オプションには、1 か 2 を指定する必要がある
  • 基本的に、-m オプションの引数には 1 を指定していれば大丈夫

詳細

*git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]]*

https://git-scm.com/docs/git-revert から引用

マージコミットは、2つの親を持つ

main ブランチと feature/xxx ブランチが存在してます。それぞれコミットを積んでますが、commitF というのが、feature/xxxmain に取り込むマージコミットです。この場合、commitFmainfeature/xxx の2つの親を持つことになります。
そのため、どちらの親を正とするのかを決める必要があります。

実際に動かしてみる

上記の状態を作り、git log で見てみると以下のようになる。この状態から、git revert -m 1git revert -m 2 を実行して差分を見てみる。

$ git log --graph --all --format="%x09%an%x09%h %d %s"
*       d843e0d  (HEAD -> master) Merge branch 'feature/xxx'
|\
| *     c8cbfaa  (feature/xxx) feat: commit E
| *     8fc1060  feat: commit D
* |     78c02e8  feat: commit C
* |     8aff8e5  feat: commit B
|/
*       b83b27d  feat: commit A

commit-hash が 78c02e8 の状態まで戻ったので、 feature/xxx の変更を切り戻したい場合の理想の操作であり、一番よく使われるもの。こちらは feature/xxx ブランチで積まれたコミットである c8cbfaa, 8fc1060 の変更は打ち消されている。

$ git revert -m 1 842ec16
this reverts commit d843e0d, reversing changes mode to 78c02e8.

commit-hash が c8cbfaa の状態になり、78c02e88aff8e5 の変更は削除された。feature/xxx がマージされるまでの変更は亡き者として扱われ、feature/xxx の変更が正として反映される。これは経験したことがないし、イメージも正直湧かないのであまり使う機会はないのかなと思ったりしている。

$ git revert -m 2 842ec16
this reverts commit 842ec16, reversing changes mode to c8cbfaa.

参考

https://git-scm.com/docs/git-revert

Discussion