🐡

Git 履歴から誤ったマージコミットを削除する

に公開

はじめに

開発作業中、ブランチに最新の変更を取り込もうとして誤って main ブランチをマージしてしまったケースについて説明します。本来は develop ブランチをマージすべきだったところ、間違えてしまいました。

この誤ったマージによりコミット履歴が汚染されたため、不要なマージコミットを削除する方法を紹介します。

対処法

1. 削除対象のコミットを特定する

まず最初に、git log --oneline コマンドを実行して、削除したいコミットのハッシュ値を確認します。

f208c769 モックデータ及び不要なコメントアウトの削除
5328c922 不要なコメントの削除
2aed74be Merge branch 'develop' into feat-license-table-sort
100aa3d1 lintエラー修正
3b67af16 HideInProductionViewの削除         # 削除対象
763edd65 Merge branch 'main' into feat-license-table-sort  # 削除対象
783227e2 pnpm format
...

上記の例では、763edd65(誤ったマージコミット)と3b67af16(関連する変更)の 2 つのコミットを削除する必要があります。

2. 対話的リベースを実行する

削除したいコミットの直前のコミット(この例では783227e2)を基点にして、対話的リベースを開始します。

git rebase -i 783227e2

このコマンドを実行すると、エディタが開き、リベース計画が表示されます。削除したい 2 つのコミット(763edd653b67af16)の行を完全に削除し、ファイルを保存して閉じます。これで最初のリベース工程が完了します。

3. コンフリクトを解決する

リベース実行後、必ずと言っていいほどコンフリクトが発生します。このようなコンフリクトが表示されるでしょう:

<<<<<<< HEAD
export const APP_VERSION = "1.6.13";
=======
export const APP_VERSION = "1.7.4";
>>>>>>> 84b2f77f (version up 1.7.4 [skip ci])

発生するコンフリクトの多くは、削除しようとしている誤ったマージが原因です。基本的には現在のブランチの状態(HEAD)を採用することで問題ありません。

全てのコンフリクトを解決するまで、この作業を繰り返します。

4. 変更をリモートリポジトリに反映する

リベースが完了したら、変更をリモートリポジトリに反映させます。この操作は履歴を書き換えるため、強制プッシュが必要になります。

git push origin feat-license-table-sort --force

 
 
 
 
以上です。

KA projects

Discussion