GitHub で pull requst の merge を取り消す方法
こんにちは。 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 を取り消す手順は以下の通りです。
- pull request での merge を revert する pull request を作成する
- 図中の GitHub repository の revert branch
1ce03ef
- 図中の GitHub repository の revert branch
- 1 の pull request を merge する
- 図中の GitHub repository の main branch
4f06c3b
- 図中の GitHub repository の main branch
- 2 で merge された branch をローカルに pull する
- 図中の local repository の main branch
4f06c3b
- 図中の local repository の main branch
- PR のローカルブランチに 3 を merge する
- 図中の local repository の dev branch
4f06c3b
- 図中の local repository の dev branch
- 4 を revert する
- 図中の local repository の dev branch
15157ab
- 図中の local repository の dev branch
- 5 をリモートブランチに push する
- 図中の GitHub repository の dev branch
15157ab
- 図中の GitHub repository の dev branch
- 再度 pull request を作り直す
各 branch の commit 履歴の例
GitHub の pull request は merge してしまうと、 re-open ができません。
もう一度 pull request を利用したい場合は、 新しい pull request を作り直す必要があります。
取り消し手順の詳細
revert 用の pull request の作成
merge された pull request には Revert というボタンが表示されるようになります。
pull request に表示されている Revert ボタンを押す
Revert ボタンを押すことで、 revert 用の pull request の作成画面に遷移します。
必要に応じてタイトルや説明を編集したあと、 Create pull request ボタンを押します。
Create pull request を押して pull request を作成する
pull request を作成すると、自動的に merge を revert した branch が生成されます。
revert 用の pull request の merge
作成した revert 用の pull request を merge することで、 GitHub 側の merge を revert します。
Merge pull request ボタンを押して revert する
revert した branch をローカル側に取り込む
GitHub で revert 用の pull request を merge したら、ローカルにも pull しておきましょう。
前述の commit 履歴の図の場合、 GitHub 側の main の commit 4f06c3b
をローカルの main に pull します。
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 を作成しようとして差分がないと表示されている
これは、 既に 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 を作成しようとしても差分が発生しません。
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 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
結構大変ですね。。。
頭の中で手順を考える分には、
と考えればよいのですが、 GitHub 側の操作と、ローカルの Git の操作が混在するので、少しややこしくなっています...
私自身も、実際に手を動かしたときは、結構混乱しました...
ご返信ありがとうございます。
本当に助かりました。
やはりマージは気をつけたほうがいいですね。