LoginSignup
6
5

More than 3 years have passed since last update.

不要マージコミットを消し去ってプッシュし直したい

Posted at

先日不要なmerge commitを含んだブランチをリモートにプッシュしたらあわわわになったので残します。
誤った理解で実行していたものがあったのが原因なので後輩を生まないために記します。

背景

  1. ローカル feature/で作業していた
  2. 誤って作業ブランチにプルった(ブランチ違いに気付いてない
  3. merge commitに気付かず作業ブランチをリモートプッシュ
  4. やばい要らんコミットめっちゃある😇

やりたいこと

  • merge commit をないことにして、上がってしまった不要なコミットを消したい

やったこと

まず調べたら出てくる[マージコミット 取り消す]とかで出てくるrevertを実行。

1. revertで該当マージコミットを打ち消す

git revert -m 1 <merge commit>

マージコミットに対してrevertを使用する場合は--mainline (-m)のオプションが必要。
ちなみにこの数字は、マージコミットを消し去った場合に、マージされた側(1)、マージした側(2)どちらを軸にするかという事。

2. 差分が消えたのでプッシュしたらコミットだけ残っている

Screen Shot 2019-08-31 at 11.14.37.png

ここで先輩エンジニアが、こいつをこのまま独走させる何かヤバイと感じ取ってくれたのか以下の解決策を提案してくれた。

解決策

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したのにコミットがたくさん残っていたのかわからない。メインラインが
逆だったのだろうか。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5