【Git】マージを取り消す

2021年7月23日

ブランチのマージを取り消す方法についてまとめます。

リモートブランチにプッシュ後にマージを取り消す際には注意してください!!

図1. ブランチの初期状態

1つのマージを取り消す

図1の状態からbranch1をmasterへマージすると以下のような状態になります。

$ gti branch master
$ git merge branch1
図2. branch1をmasterにマージした状態
# 図1の状態に戻る
$ git reset --hard ORIG_HEAD

# 図1の状態に戻った後に続けて実行すると図2の状態になる
$ git reset --hard ORIG_HEAD

複数のマージを取り消す

図1の状態からbranch1、branch2をmasterにマージすると以下のような状態になります。

図3. branch1とbranch2をmasterにマージした状態

この状態からbranch1、branch2のマージを取り消すためにはmasterブランチを図4の赤で示したコミットまで戻します。

図4. マージ前のmasterのコミット

赤で示したコミットを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}