まくまくGitノート
マージのためのコミットを revert する(取り消す)
2010-10-08

マージのためにコミットされた変更を 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-----+
2010-10-08