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
となる。