【Git】マージを取り消す
ブランチのマージを取り消す方法についてまとめます。
リモートブランチにプッシュ後にマージを取り消す際には注意してください!!
1つのマージを取り消す
図1の状態からbranch1をmasterへマージすると以下のような状態になります。
$ gti branch master
$ git merge branch1
# 図1の状態に戻る
$ git reset --hard ORIG_HEAD
# 図1の状態に戻った後に続けて実行すると図2の状態になる
$ git reset --hard ORIG_HEAD
複数のマージを取り消す
図1の状態からbranch1、branch2をmasterにマージすると以下のような状態になります。
この状態からbranch1、branch2のマージを取り消すためにはmasterブランチを図4の赤で示したコミットまで戻します。
赤で示したコミットをgit reflogで確認します。git reflogを実行すると以下のようにHEADの移動履歴を確認できます。この中から目的のコミットをコミットコメントや前後のコミットを見て探します。
今回は検証のためコミットコメントが適当ですが、戻したいコミットは「75f837b HEAD@{11}: commit: add line」です。
$ git reflog
ba15a75 (HEAD -> master) HEAD@{0}: merge branch2: Merge made by the 'recursive' strategy.
da68f0e HEAD@{1}: commit (merge): merge branch1
75f837b HEAD@{2}: checkout: moving from branch1 to master
a808e6c (branch1) HEAD@{3}: commit: add line branch1
d5c9f90 HEAD@{4}: checkout: moving from branch2 to branch1
ee5f031 (branch2) HEAD@{5}: commit: add line branch2
f71740b HEAD@{6}: commit: add line branch2
4b93fea HEAD@{7}: commit: add line branch2
d5c9f90 HEAD@{8}: checkout: moving from branch1 to branch2
d5c9f90 HEAD@{9}: commit: add line branch1
12b3146 HEAD@{10}: checkout: moving from master to branch1
75f837b HEAD@{11}: commit: add line # ←これ
829344b HEAD@{12}: checkout: moving from branch1 to master
12b3146 HEAD@{13}: commit: add line branch1
829344b HEAD@{14}: checkout: moving from master to branch1
829344b HEAD@{15}: commit: add line
fb1686a HEAD@{16}: commit (initial): add line
コミットが見つかればgit reset –hardで目的のコミットまでHEADを移動しファイルの状態も戻します。
$ git reset --hard HEAD@{11}
マージを取り消したけど、やっぱりマージした後に戻したい場合はgit reflogで履歴を確認してマージ後のコミットを指定してgit reset –hardします。以下の例では「ba15a75 HEAD@{1}: merge branch2: Merge made by the 'recursive’ strategy.」のコミットに戻します。
$ git reflog
75f837b (HEAD -> master) HEAD@{0}: reset: moving to HEAD@{11} # ←branch1, branch2のマージを取り消したgit reset --hard
ba15a75 HEAD@{1}: merge branch2: Merge made by the 'recursive' strategy. # ←branch2をマージしたコミット、ここに戻す
da68f0e HEAD@{2}: commit (merge): merge branch1
75f837b (HEAD -> master) HEAD@{3}: checkout: moving from branch1 to master
a808e6c (branch1) HEAD@{4}: commit: add line branch1
d5c9f90 HEAD@{5}: checkout: moving from branch2 to branch1
ee5f031 (branch2) HEAD@{6}: commit: add line branch2
f71740b HEAD@{7}: commit: add line branch2
4b93fea HEAD@{8}: commit: add line branch2
d5c9f90 HEAD@{9}: checkout: moving from branch1 to branch2
d5c9f90 HEAD@{10}: commit: add line branch1
12b3146 HEAD@{11}: checkout: moving from master to branch1
75f837b (HEAD -> master) HEAD@{12}: commit: add line
829344b HEAD@{13}: checkout: moving from branch1 to master
12b3146 HEAD@{14}: commit: add line branch1
829344b HEAD@{15}: checkout: moving from master to branch1
829344b HEAD@{16}: commit: add line
fb1686a HEAD@{17}: commit (initial): add line
$ git reset --hard HEAD@{1}