Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

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 showgit 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: