git mergeしたあとにコミットして mergeを取り消す方法
とあるエンジニアの私は、
mainブランチ、developブランチ、featureブランチで開発していました。
featureブランチでApprove(上司からのOK)をもらい、マージしようとします。
しかし、コンフリクトが起きていました。
親ブランチであるdevelopをマージしないといけないのですが、親の親ブランチのmainを誤ってマージ、
その上、修正コミットまでしてしまいました。
すでにリモートにプッシュしてしまっていますが、mainブランチとのマージだけを取り消したくなり、
調べました。
マージの取り消し方法
ログを確認
# ローカルリポジトリのコミットログを確認
git log
commit c29f7893d40795cb2db6b78804791ae7ba77f4b6 (origin/add-cs-fix)
Author: sample user
Date: Sun Feb 5 07:26:17 2023 +0900
[test]commit comment
commit d275e203fab6152d36ab6df6a2d82d3b51daa1d4
Author: sample user
Date: Tue Jan 3 14:29:24 2023 +0900
[test]
commit a997f7b6ec06e489946313745591a0ed095ea715
Author: sample user
Date: Mon Jan 2 20:52:55 2023 +0900
[add]Item Get処理の追加
commit d39d48d1e0c3126bfa81f8be91a12791a43b3286
Author: sample user
Date: Mon Jan 2 20:52:20 2023 +0900
[add]環境構築
以下の4行で並んでいるので、commit番号の取り間違いには注意しましょう
commit:
Author:
Date:
コミットメッセージ
revertで戻す
コミット番号が取得できたらgit revertの-m
オプションで取り消しをします
git revert -m [1 or 2] コミット番号
ここで-m
で指定するブランチに注意してください。
-m オプション
-m
オプションは、マージコミットの親を指定するためのものです。
マージコミットは、複数の親を持つため、どの親コミットを取り消すかを指定する必要があります。
-m 1
は、マージコミットの最初の親を取り消すことを意味します。
例えば、featureブランチをmainブランチにマージした際のマージコミットでは、
最初の親はmainブランチの最新コミットであり、2番目の親はfeatureブランチの最新コミットです。
そのためマージして、コミットした後に、過去のマージを取り消したい場合は1を指定します
# e886a398385e75fa99f897352432359386421d023コミットを取り消す
git revert -m 1 e886a398385e75fa99f897352432359386421d023
# 変更をコミット
git commit