gitのmerge-commitをrevertする

これまでtopic branchをmergeするときはrebaseしてfast-forwardな状態でmergeするか、merge --squashして何かあった時にすぐに戻せるようにと考えていたのですが、そもそもmergeを簡単にrevert出来れば問題ないしどうやるのかなぁと思って調べたところ、revert -mオプションで出来るんですね。
http://qiita.com/items/41b724a1c3569044372c


(mergeした記録を残す必要がないときはfast-forwardなmergeでもいいと思いますがその辺りの議論は http://togetter.com/li/407277 を)

mergeコミットを取り消したい場合

% git revert -m 1 mergeコミットのSHA1

という感じでやれば出来るのですが-mの後の数値ってなんだということで色々試してみました。
オプションを見ると-mの--mainlineの省略形でmainlineのparent-numberを指定するようです。

Usually you cannot revert a merge because you do not know which
side of the merge should be considered the mainline. This option
specifies the parent number (starting from 1) of the mainline and
allows revert to reverse the change relative to the specified
parent.

テストするブランチの状態
  • masterのREADME
initial commit!!!
from master1
from master2
  • developのREADME
initial commit!!!
from develop1
from develop2
  • mergeする
% git co master
% git merge --no-ff develop
# confrictの解消
% merge後のREADME
initial commit!!!
from master1
from master2
from develop1
from develop2
  • logの確認 ( commit log == READMEの行)
% git log --oneline --graph
* 375895c Revert "Merge branch 'develop'"
*   4c03b80 Merge branch 'develop'
|\  
| * 975a3b2 from develop2
| * 9732b33 from develop1
* | 4225ab1 from master2
* | 2d07f6d from master1
|/  
* be9b1b4 initial commit

「-m 1」でrevertする

  • この場合developのmergeを取り消すことが出来ます
% git revert -m 1 4c03b80
[master ba46e36] Revert "Merge branch 'develop'"
 1 file changed, 2 deletions(-)
  • diff
% git diff 4c03b80
diff --git a/README b/README
index d761f86..73735d7 100644
--- a/README
+++ b/README
@@ -2,5 +2,3 @@ initial commit!!!
 from master1
 from master2
-from develop1
-from develop2

「-m 2」でrevertする

  • この場合、masterがdevelopブランチと同じ状態になります
% git revert -m 2 4c03b80
[master 4eb3086] Revert "Merge branch 'develop'"
 1 file changed, 2 deletions(-)
  • diff
% git diff 4c03b80
diff --git a/README b/README
index d761f86..73735d7 100644
--- a/README
+++ b/README
@@ -1,6 +1,4 @@
 initial commit!!!
-from master1
-from master2
 from develop1
 from develop2

「-m 3」でrevertする

% git revert -m 3 4c03b80
error: Commit 4c03b801057726d4429337a9c76befa7a24c9b6d does not have parent 3
fatal: revert failed

ということでmainlineのparent_numberというのは1が「mergeされたブランチ(今のブランチ)」、2が「mergeしたブランチ(develop)」という感じになっているようです。「-m 2」を使う状況がイマイチ思いつかないので多くの場合は「-m 1」を指定することになるのかなと思います。


といいながらもやっとしている部分もまだ残ってたりしてgitむずい。。
間違いがあれば指摘してもらえると嬉しいです。