GitHubのrevertでコンフリクトが起きた時


普段、GitHubのrevertは一度マージして環境に入ったPRを何かしらの理由で外す時に使ってます。

revertのやり方は特に難しい話ではないと思うのですが、(過去にも記事にしてます)今回ちょっとイレギュラーなケースが起きたので、備忘録として記事にしました。

1週間ほど前にとある機能を実装して、無事にマージされたPRがあったのですが、テストが追いついてないからXX日のリリース対象から外したいのでrevertしてほしいとPMから言われる。

いつものようにrevertしようとしたら、こんなエラーメッセージが。。。

content may have changed since it was merged
マージされてから差分が出てるから自動でrevertは無理ですよって。。
実際このPRが入ってから別のPRが次々マージされてしまったのが原因。

通常のrevertはGitHub上で自動で簡単にできますが、revertによってコンフリクトが発生する場合はGitHub上ではできないらしいです・・・

今回はこうしたrevertによってコンフリクトが起きた場合に、コンフリクトを解消しつつ、revertする方法を紹介します。(他にもやり方色々あると思いますが、個人的にこれが一番シンプルでやりやすいと思いました。)

手順:

1) まず、Revert用に新しくブランチを切ります。(ブランチ名はrevert-hogeとかお好きなように)

2) ターミナルでコマンドを実行

git revert <commit hash>

このcommit hashはrevertするPRがマージされた時のcommit hashです。
PR見るのが一番確実。

すると、warning出ます、つまりコンフリクト解消してねって事です。

error: could not revert 98b44b2e6... コミットメッセージがここに出ます (#6007)
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

3) コンフリクト解消します。これは通常のコンフリクト解消と全く同じ。

コンフリクトしなかったファイル達は自動でStagingされます。
(revertなので、自分の書いたコードが消える逆の変更が入ります。)

4) いつものように、add, commitし、リモートにPushします。

5) プルリクを作れば、普段GitHub上で自動で作られるrevert PRと同じものが完成です。

あとはReview依頼出して、マージされたら完了。

というわけで、最初に見慣れないエラーが出て焦りましたが、意外とシンプルに解決できました。

revert自体普段そんなにやらないし、こういうたまにしかやらない事はドキュメント化しておかないと次同じ状況になった時に困るので、備忘録として記事にしました。