git revert

コミットの逆コミットをするコマンド

コマンドの概要

指定したコミットの差分を逆方向にして新たにコミットを作成するコマンド。コミットを取り消したいときに使用する。
「revert」とは「もとに戻す」、とか「逆戻り」という意味。対象に指定したコミットの変更差分を逆にして新たにコミットを作成する。「A+B+C」に「A+B+C-B」として「-B」を加算することによりBをなかったことにするイメージ。

コマンドの使い方

$ git revert <commit>

ワーキングツリーに変更がない状態でないと実行できないが、コミットを指定してコマンドを実行すると、指定したコミットの差分を逆にしたコミットが作成される。

$ git revert -n <commit>

git revertにより新たなコミットを作成するのではなく、インデックスに展開するオプション。複数のコミットをまとめてgit revertする際などに利用する

マージコミットの revert

マージコミットを対象としてもgit revertは使用できる。マージされたブランチのコミットを逆にして新たにコミットを作成するため、マージがなかったものとして機能する。
masterブランチでコミットA,B、featureブランチでコミットC,Dという状態でmasterブランチでfeatureブランチをマージすると、

master : A - B - E(C,D) : HEAD(A,B,C,D)
               /
feature: C - D

マージコミットEにコミットCとコミットDの内容が含まれる。 Eのマージコミットを対象としてgit revertすると

master : A - B - E(C,D) - F(-C,-D)  : HEAD(A,B)
               /
feature: C - D

となり、masterブランチのHEADでは、コミットA、Bの差分のみが含まれマージを取り消したように機能する。
ただし、featureブランチで開発を続け、マージできる状況になったと判断、マージすると

master : A - B - E - F - I(G,H) : HEAD(A,B,G,H)
               /       /
feature: C - D - G - H

マージコミットIにはコミットG、Hしか含まれず、コミットC、Dは含まれないことになる。
なぜかというと、

master : A - B - E(C,D) - F(-C,-D) - I(G,H) : HEAD (A,B,G,H) 
               /                   /
feature: C - D - - - - - - -  G - H 

revertコミットFはgit mergeを取り消ししたのではなく、git mergeされた差分(コミットE)の逆の差分で新たに"コミット"されているため、コミットA、Bはすでにmasterブランチにマージされているから。
あらためてコミットC、D、G、Hの内容をマージするには、revertコミットFをgit revertすればよい。

master : A - B - E(C,D) - F(-C,-D) - I(G,H) - J(C,D) : HEAD(A,B,C,D,G,H)
               /                   /
feature: C - D - - - - - - -  G - H 

となる。

Last modified 2020.05.25