先日不要なmerge commitを含んだブランチをリモートにプッシュしたらあわわわになったので残します。
誤った理解で実行していたものがあったのが原因なので後輩を生まないために記します。
背景
- ローカル feature/で作業していた
- 誤って作業ブランチにプルった(ブランチ違いに気付いてない
- merge commitに気付かず作業ブランチをリモートプッシュ
- やばい要らんコミットめっちゃある😇
やりたいこと
- merge commit をないことにして、上がってしまった不要なコミットを消したい
やったこと
まず調べたら出てくる[マージコミット 取り消す]
とかで出てくるrevert
を実行。
1. revertで該当マージコミットを打ち消す
git revert -m 1 <merge commit>
マージコミットに対してrevert
を使用する場合は--mainline (-m)
のオプションが必要。
ちなみにこの数字は、マージコミットを消し去った場合に、マージされた側(1)、マージした側(2)どちらを軸にするかという事。
2. 差分が消えたのでプッシュしたらコミットだけ残っている

ここで先輩エンジニアが、こいつをこのまま独走させる何かヤバイと感じ取ってくれたのか以下の解決策を提案してくれた。
解決策
rebaseでコミットを削除して整える
git rebase -i -p <消したいコミットの一個前>
を使用して不要なコミットを削除。
この場合、以下の2行を削除。
pick 25c2372 Merge........... ← 間違ったマージコミット削除
pick 9770416 first...........
pick 9999999 Revert.......... ← 失敗したリバート削除
プッシュすると不要コミットがなくなって理想の形に。
rebase オプション詳細
略 | 正式 | 用途 |
---|---|---|
-i | --interactive | 文字通り対話的に操作でき、コミットの削除や複数をまとめたりといった操作が可能 |
-p | --preserve--merges | ブランチの構成を保ったままリベースされる 参考: https://qiita.com/yukimaeto/items/983a4e27dbc92e6aa6fb |
※--preserve--mergesは git version 2.20よりdeprecatedになります。代替えとして--rebase--mergesが用意されています。
まとめ
結局rebase -i
が使い勝手よくて良い。
だがなぜrevert
したのにコミットがたくさん残っていたのかわからない。メインラインが
逆だったのだろうか。