株式会社クイックのWebサービス開発blog

HAPPYなサービスプランナー・エンジニア・デザイナーのブログです。

merge commitのrevert commitをrevertしてたけど気持ち悪いからやめました。

こんにちは。mikkiです。
今回はGit運用でずっと気持ち悪いと思っていた、revertのrevertをやめる方法を見つけたので、こちらに記載したいと思います。
(もしかしたらこんなことしてたの私だけかもしれない。。。)

Gitの説明は省くので、勉強されたい方は詳しく説明の載っている外部サイトをご覧ください。
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜【プロジェクト管理ツールBacklog】



どんな時にrevertのrevertをしていたのか

developブランチから複数のfeatureを切り、developにmergeし動作確認を行っているとします。 追い越しリリースやバグが見つかった場合、対象featureブランチのmergeコミットをなかったことにしたいのでrevertします。 リリースが終わった後developに対象featureブランチのmergeコミットを復活させたいので、ここでもう一度revertをしていました。
これが今回やめようと思ったrevertのrevertです。

f:id:aimstogeek:20190411191632p:plain
revert commitのrevertをしている図

revertのrevertをしなくてもfeatureブランチをmergeしなおせばいいのでは、と考えたこともありました。 ですがdevelopブランチでは打ち消しコミットが入っているので、featureブランチを再度mergeしようとするとconflictしちゃうんです。 あるいはmerge時点より前のcommitがなかったことになってしまいます。
そのため、気持ち悪いけどrevertのrevertを行っていました。

f:id:aimstogeek:20190411190544p:plain
revert commitが有効な状態を示す図

今までrevertすることがほぼなかったので我慢していましたが、必要になると管理が大変なことに気がつきました。 それにバグが含まれていることが理由でrevertした場合、もう一度revertしてdevelopにバグを混入するのって気持ち悪いですよね?
運用を変更したい理由が二つも思い浮かんだら、変える他ないと思い、revertをrevertせずにmergeコミットの復活方法がないか検証しました。

revertのrevertをせずに修正を加える方法

結論から言うとcherry-pickを使います。

cherry-pick自体の説明は冒頭でご紹介したサイトをご覧ください。
4. cherry-pick【チュートリアル3 コミットを書き換えよう!】 | サルでもわかるGit入門【プロジェクト管理ツールBacklog】

手順

  1. developからmergeコミットをrevert
  2. 最新のdevelopをfeatureに取り込む
  3. featureの戻したい時点のコミットをcherry-pickする
  4. 修正したい場合はここで修正を加える
  5. マジリク投げる
  6. mergeする

f:id:aimstogeek:20190411191417p:plain
渾身のcherry-pick

これでrevertのrevertをすることなく、綺麗に修正を加えることができました!!!

最後に

実は今回、クイックのスクラムマスターことフルーツパーラーさんに相談して手順を確立しました。
チャットで相談したところ「えぇ⤴︎なんすか!なんすか!」と面白そうに、一緒になって事象の検証から手順の確立まで行ってくださいました!
別プロジェクトで忙しいのに、ラフに相談に乗ってくださるフルーツパーラーさんはじめみんなにいつも助けられてます。感謝感謝です。

最後までこの記事を読んでくださった画面の前のあなた!ありがとうございます。
他の手段やもっといいアイディアがあれば、ぜひコメントください。お待ちしております。


\\『明日のはたらくを創る』仲間を募集中です!! // 919.jp