↩️

GitHub で pull requst の merge を取り消す方法

に公開3

こんにちは。 SAW です。
最近、 舞洲のゴーカート に乗ってきました。
初めてでタイムは遅かったですが、とても楽しめました。

GitHub の pull request を merge すると、 その pull request を re-open することはできません。
誤って pull request を merge してしまった場合、 merge を取り消す必要があります。

本記事では、 GitHub の pull request の merge を取り消す方法を紹介します。
また、 merge を取り消した後に、もう一度 pull request を利用する方法についても説明します。

対象読者

本記事で想定する読者層は次の通りです。

  • Git の revert についての知識を有している
  • GitHub の pull request についての基礎知識を有している

pull request の merge を取り消す手順

GitHub の pull request の merge を取り消す手順は以下の通りです。

  1. pull request での merge を revert する pull request を作成する
    • 図中の GitHub repositoryrevert branch 1ce03ef
  2. 1 の pull request を merge する
    • 図中の GitHub repositorymain branch 4f06c3b
  3. 2 で merge された branch をローカルに pull する
    • 図中の local repositorymain branch 4f06c3b
  4. PR のローカルブランチに 3 を merge する
    • 図中の local repositorydev branch 4f06c3b
  5. 4 を revert する
    • 図中の local repositorydev branch 15157ab
  6. 5 をリモートブランチに push する
    • 図中の GitHub repositorydev branch 15157ab
  7. 再度 pull request を作り直す

ローカルと GitHub のそれぞれの branch の commit 履歴例の図
各 branch の commit 履歴の例

GitHub の pull request は merge してしまうと、 re-open ができません。
もう一度 pull request を利用したい場合は、 新しい pull request を作り直す必要があります。

取り消し手順の詳細

revert 用の pull request の作成

merge された pull request には Revert というボタンが表示されるようになります。

merge 済の pull request に Revert ボタンが表示されるようになる
pull request に表示されている Revert ボタンを押す

Revert ボタンを押すことで、 revert 用の pull request の作成画面に遷移します。
必要に応じてタイトルや説明を編集したあと、 Create pull request ボタンを押します。

revert 用の pull request の作成画面
Create pull request を押して pull request を作成する

pull request を作成すると、自動的に merge を revert した branch が生成されます。

revert 用の pull request の merge

作成した revert 用の pull request を merge することで、 GitHub 側の merge を revert します。

作成した pull request の画面
Merge pull request ボタンを押して revert する

revert した branch をローカル側に取り込む

GitHub で revert 用の pull request を merge したら、ローカルにも pull しておきましょう。

前述の commit 履歴の図の場合、 GitHub 側の main の commit 4f06c3b をローカルの main に pull します。

GitHub での revert 内容をローカルに取り込む
git switch main
git pull

pull しておかないと、ローカルと GitHub 側で commit 履歴にズレが発生します。
commit 履歴がズレた状態で別の commit が作成して push しようとすると、 conflict する可能性があります。
conflict を起こす可能性を抑えるためにも、ローカルに pull しておくことをオススメします。

merge の revert commit の作成

pull request を再作成するための注意点

誤って pull request を merge してしまい、同じ内容の pull request を復元したい場合は、新たに pull request を作成する必要があります。

注意点として、 merge 元の branch で、 "pull request の revert" を revert する必要があります。
これを行わないと、以下の図のように差分が表示されず、 pull request が作成できません。

pull request を作成しようとして差分が表示されない画面
pull request を作成しようとして差分がないと表示されている

これは、 既に merge 元の branch の commit hash が merge 先の branch に含まれているため です。

前述の commit 履歴の図の場合、 merge 元の branch が dev, merge 先の branch が main のとき、 dev の commit hash は c08f5d7, main の commit hash は 4f06c3b になっている状態です。
以下の図のように、 dev の commit hash c08f5d7 は main に包含されているため、 pull request を作成しようとしても差分が発生しません。

main の commit 履歴に dev が包含されている図
dev の commit が main に包含されている

pull request での revert を revert

pull request を再作成するために、 revert した内容をさらに revert します。
操作の内容としては、 「変更の取り消し」を取り消し しています。
そのため、ファイルの変更差分としては、最初の pull request の merge 前と同じ状態になります。

今回の場合は merge 元の branch である dev に、前節で pull した main を merge します。
これで、 dev に revert 用の pull request の merge commit が取り込まれます。

main を dev に merge した後、 git revert を実行します。
今回の例の場合、 revert する commit が merge commit のため、 -m オプションが必要です。

git revert するコマンドの流れ
git switch dev
git merge main
git revert -m 1 4f06c3b

pull request の再作成

前節で revert した後、 GitHub の dev に push します。
これで main に包含されない commit hash が dev に追加されるため、 pull request が作成できるようになります。

変更差分は最初に pull request を merge する前と同じ内容になります。
ただし、 merge してしまった pull request のコメントは引き継げないので、前のやり取りを参照したい場合は pull request の description などにリンクを貼っておくと良いでしょう。

まとめ

本記事のまとめは次の通りです。

  • GitHub の pull request の merge を取り消す方法を紹介
  • 再度同じ差分の内容の pull request を作り直す手順を紹介

一度 pull request を merge してしまうと、同じ pull request は re-open できませんし、 merge の取り消しも少し手順が煩雑です。
pull request を merge するときは慎重に行いましょう。

Discussion

梁震梁震

結構大変ですね。。。

SAWSAW

頭の中で手順を考える分には、

  1. merge を取り消す
  2. 「merge の取り消し」をさらに取り消す

と考えればよいのですが、 GitHub 側の操作と、ローカルの Git の操作が混在するので、少しややこしくなっています...

私自身も、実際に手を動かしたときは、結構混乱しました...

梁震梁震

ご返信ありがとうございます。
本当に助かりました。
やはりマージは気をつけたほうがいいですね。