🐡
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 つのコミット(763edd65
と3b67af16
)の行を完全に削除し、ファイルを保存して閉じます。これで最初のリベース工程が完了します。
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
以上です。
Discussion