マージコミットをリバートする際に利用する脳死の -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/xxx
を main
に取り込むマージコミットです。この場合、commitF
は main
と feature/xxx
の2つの親を持つことになります。
そのため、どちらの親を正とするのかを決める必要があります。
実際に動かしてみる
上記の状態を作り、git log
で見てみると以下のようになる。この状態から、git revert -m 1
と git 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
の状態になり、78c02e8
と 8aff8e5
の変更は削除された。feature/xxx がマージされるまでの変更は亡き者として扱われ、feature/xxx
の変更が正として反映される。これは経験したことがないし、イメージも正直湧かないのであまり使う機会はないのかなと思ったりしている。
$ git revert -m 2 842ec16
this reverts commit 842ec16, reversing changes mode to c8cbfaa.
参考
Discussion