fatal: Commit <コミットID> is a merge but no -m option was given.
git revert <コミットID>ができない
こんなエラーが出ました。
$ git revert f780e4d fatal: Commit f780e4d is a merge but no -m option was given. # コミット「f780e4d」はマージされてるけど、`-m`オプションが付与されてないよ。
マージコミットをリバートしようとしているのが原因
マージコミット(例、プルリクエストのマージボタンを押したときにできるコミット)はgit revert
だけではリバートできません。
今回はテストのため、意図的にマージコミットを作りました。やり方はこちらです。
$ git branch * master $ git checkout -b a $ touch a.tsv $ git add a $ git commit $ git checkout -b b $ touch b.tsv $ git add b.tsv $ git commit $ git checkout master $ git merge a b
対応方法
①本線を確認する
git rever -m
には親番号を指定する必要があります。
コミット履歴をグラフ化すると一目瞭然なのですが、マージコミットには2つ以上の線が存在します(その線がマージされてコミットとなっています)。
今回は「30cc2f4」に「beb91c3」がマージされているので、「30cc2f4」が本線と分かります。
$ git log --graph --oneline * f780e4d Merge branches 'a' and 'b' |\ | * beb91c3 add b * | 30cc2f4 add a |/
②親番号を確認する
「30cc2f4」の番号はgit show
やgit cat-file -p
で確認できます。
git show <コミットID>
Mergeの左から1, 2です。
$ git show 8dcc4d7 commit xxx Merge: 30cc2f4 beb91c3 ...
git cat-file -p <コミットID>
parentの上から1, 2です。
$ git cat-file -p 8dcc4d7 tree xxx parent 30cc2f48c07f368cd91e794865efae3b5ef5d3b3 parent beb91c34f591a1998ac59606269f60f275fc7cbf ...
③git revert -m <親番号>でリバートする
1つめのコミットID「30cc2f4」が本筋であるので、親番号は「1」です。
$ git revert -m 1 f780e4d
参考
akiyoko.hatenablog.jp qiita.com
追記
記事の整理をしているので、更新通知が飛びまくったりしていたらすみません :bow: