GitHub

【Git】Gitでmerge後のコミットを取り消す方法!失敗したmergeを簡単にやり直す手順

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

-GitHub