マージのためにコミットされた変更を revert する作業は少々やっかいです。 例えば、master ブランチとトピックブランチ上での修正が、下記のようにコミット G でマージされているとします。
A---B---C---D---E---G ← master
| |
+-----F-----+ ← topic
このとき、コミット G の変更内容にミスが見つかり、コミット G を revert したくなったとしても、単純に以下のようには revert することはできません。
$ git revert HEAD
なぜなら、この revert を許してしまうと、以下のように、どちらが master なのか分からない状態、つまり意図しない [1] と [2] のブランチができたような状態になってしまうからです。 このような状態が許されると、他の人が変更を fetch しようとした場合に、どちらを master ブランチとして取り込めばよいのか分からなくなってしまいます。
A---B---C---D---E [1] master?
|
+-----F [2] master?
そこで、マージのためのコミットを revert するときは、revert 後にどちらの修正を master として残すかを指定する必要があります。
どちらを残すかは、-m
オプションに 1, 2 のような数値で指定します。ここでは [1] の方を残すことにします。
$ git revert -m 1 HEAD
これで、コミット G を打ち消すためのコミット H が作成されます。
A---B---C---D---E---G---H
| |
+-----F-----+
コミット H 以降のバージョンを fetch してくると、下側のブランチの内容(すなわちコミット F での修正内容)は含まれていないように見えます(マージ作業を取り消すためのコミットを入れたので当然ですね)。 この後に、コミット F の内容を master に反映したい場合は、忘れずにコミット F 相当の変更をコミットしてください。
A---B---C---D---E---G---H---F'
| |
+-----F-----+