開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

git merge を git revert で取り消す方法と、注意点。

最終更新:2017-07-13 by Joe

git でコミットを打ち消すコミットを作成する「git revert」。でも、直前のコミットが git merge により作られたマージコミットである場合、それを打ち消す時は注意が必要です。

git revert の通常の使い方

通常は、打ち消したいコミットを指定するだけです。

git merge によるマージコミットを打ち消す

もし revert で打ち消す対象がマージコミットであれば、エラーが発生します。マージの際に統合された2つの歴史のうち、どちらを「正」とすればよいかが分からないからです。

この場合、オプション「-m」とともに、親番号を指定することで、特定の履歴を残して打ち消し操作が可能になります。

注意が必要なのは、このようにマージコミットを打ち消すと、打ち消されたブランチに含まれていた変更が、その後のマージにの際にも取り込みが発生しない、という事になります。revert により、変更自体は打ち消されても、マージの事実が歴史上に残り続けるからです。

下記はrevert-a-faulty-merge.txt より抜粋した、Linusによる解説の一部です。

Reverting a regular commit just effectively undoes what that commit did, and is fairly straightforward. But reverting a merge commit also undoes the _data_ that the commit changed, but it does absolutely
nothing to the effects on _history_ that the merge had.

[意訳] 通常のコミットの revert は、そのコミットが行った事を効率的に取り消しでき、直感的だ。ただ、マージコミットの revert においては、たしかにコミットが変更した「データ」は打ち消すが、コミットが与えた「履歴」へは影響しない。

マージコミットの打ち消しは、この事を念頭において実行する必要があるでしょう。