PRレビュー前のブランチを間違えてマージしてしまった時の対処法

## はじめに

こんにちは！

先日、チーム開発を実施する中で、PR（プルリクエスト）レビュー完了前のリモートブランチを目的のリモートブランチに誤ってマージするというミスを経験しました。

本記事ではそのミスが起こった際に実際に対処した方法について解説します。

この記事が同じミスをしてしまった方やGitを勉強中の方の一助になれば嬉しいです。

## 前提
* レビュー前のブランチ(featureブランチなど）を目的のブランチ(developやmainブランチなど）にマージ
* レビュー前のブランチに対するレビューの後、コード修正はなかったものとする

## 結論

### `git revert`を2回実施する。

※ レビュー前のブランチに対するレビューの後、コード修正があった場合は`git revert`は1回でOKです。

順を追って説明します。

## git revertとは

`git revert` は、特定のコミットを打ち消す新たなコミットを作成するgitのコマンドです。このコマンドは、誤って行った操作を元に戻すために使用されます。例えば、間違えてマージしたブランチを打ち消すために使うことができます。`git revert` を使用すると、指定したコミットと逆の操作を行う新しいコミットが作成され、その結果として元の状態に戻すことができます。

詳しくはこちらの記事が大変参考になりましたので、興味がある方はご覧ください。

https://zenn.dev/peishim/articles/81a34f80685cf4


## まず今回の状況を整理
##### 状況
・複数のPRレビューが溜まっている。
・あるPRレビューは完了しているが、あるPRレビューが完了していないという状況。

##### 事象
レビュー済みPRのブランチのみマージするつもりだったが、レビュー前のブランチを目的のブランチ（developブランチ）にマージしてしまった。

##### 目標
レビュー前のブランチをレビューした後に、目的のブランチ（developブランチ）に再度マージする。

## 今回やりたいこと
1. 目的のブランチ(developブランチなど）をレビュー前のブランチ(featureブランチなど）によってマージされる前の状態に戻す
2. featureブランチのレビューを完了させる
3. 再度featureブランチをdevelopブランチにマージする

上記を前提として、対応手順を説明します。

## 対応手順

今回実施した具体的な手順は9ステップあります。

#### 前提

以下手順を読む前の前提です。

・目的のブランチ名：develop
・developブランチに誤ってマージしたブランチ名：rainy
・rainyブランチのPR名：rainy（間違ってマージした際のPR。このPRはすでに完了済み）
・rainyブランチのレビューはまだ完了していない
 ※後述の対応手順5でrainyブランチのレビューを実施しますが、レビュー後のコード修正はないものとします
・レビュー完了前のrainyブランチをdevelopブランチにマージしてしまった

#### 1. 誤ってマージしたブランチ（rainyブランチ）に対するPRを開く
下図の通り「Pull requests」タブ→「Closed」タブをクリックするとPR完了済みのPRが表示されます。その中にある誤ってマージしたブランチを含むPR（今回だとrainy）をクリックします。

<img width="400" alt="ブランチ一覧" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/ed35f14d-ae9a-974b-50c3-3f1993993094.png">

#### 2. コミット履歴の中で目的のブランチ（developブランチ）にマージしたコミットを見つける。右横の「Revert」ボタンを押下。

誤ってマージしたコミット履歴の右横にある「Revert」ボタンをクリック。（`git revert`：1回目）

<img width="400" alt="ブランチ一覧" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/0195917e-729a-b818-d46f-a086050a16aa.png">

#### 3. 新規PRを作成する
新しくPRを作成するページが表示されます。この段階でrevert用の新たなブランチが作成されます。タイトルや説明が必要な場合はそれぞれの入力欄に記載後、「Create Pull Request」を押下。

![PR1_revert_rainy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/e3573f82-1e81-3067-252a-96043336d849.png)

#### 4. developブランチにマージ
revert用のブランチをdevelopブランチにマージすることで、誤ってdevelopブランチにマージした際のコミットをコミット前の状態に戻すコミットが作成されます。そうすることで、developブランチが誤ってrainyブランチをマージする前の状態に戻ります。

![merge1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/1bb4a67c-4d9f-1524-42bc-44e4baa7ee73.png)


#### 5. レビュー前ブランチのレビューを実施
rainyブランチのレビューを実施します。今回はレビュー後のコード修正はなかったものとします。

:::note warn
もしもコード修正が発生した場合は、以下の手順を実施します。
a. ローカル上でコード修正を実施。
b. ローカル上でrainyブランチに当たるブランチに最新のdevelopブランチをマージし、コンフリクトを解消。
d. rainyブランチをpush。
c. 6項以降の手順は実施せず、通常通りrainyブランチに対する新規PRを発行して対応。

※上記は考えられる対応方法の一つです。
:::

#### 6. 3項で作成したPRを開く
3項で作成したPR（PR名：Revert "rainy")を1項と同じ手順で開きます。

<img width="400" alt="ブランチ一覧" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/f18262cc-2c19-8962-3d84-d7b807c5292d.png">


#### 7. コミット履歴の中で4項で目的のブランチをrevertした際のコミット履歴を見つける。右横の「Revert」ボタンを押下。（`git revert`：2回目）

![PR 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/530095d5-3950-be97-7132-63b490d46941.png)

#### 8. 新規PRを作成する
3項と同様、新規PRを作成します。revertを実施すると下図青枠部のようにrevert用のブランチが自動で作成されます。

:::note warn
注意

revert用のブランチは始めの「誤ってdevelopブランチにマージした時点でのrainyブランチ」と中身のコードは同じです。


そのため、5項でdevelopブランチにマージする側のブランチの内容を変更した場合は、青枠部のブランチを正しいブランチに変更するか、正しいブランチに対するPRを新たに作成します。
:::

![PR7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/fb6a5d40-13ec-2e28-c002-d4ca84ef030a.png)

#### 9. 目的のブランチにマージ
revert用のブランチをdevelopブランチにマージします。

![PR5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670922/b25e9846-76f1-5a2c-516e-4dca6723fa98.png)

## 最後に

今回はGitで実際に発生したミスの対処法を解説しました。チーム開発をしているとGitを頻繁に使うため、どうしてもコマンド操作やGUIの操作ミスが起こりやすくなると思います。


そのミスを正しく認識して、正しい対処を行う必要があるということを今回の経験を通して、身に染みました。また、そもそもマージ先を間違えないよう、今後はマージされる側とマージする側のブランチが正しいかを確認した上でマージしていきたいです。

この記事が同じような事象で困っている人やGitを勉強中の方の一助になればとても嬉しいです。ご覧いただき、ありがとうございました！

## 参考記事

https://qiita.com/shungo_m/items/f6fe0e1da55414ba677c

https://qiita.com/Esfahan/items/d70dabbebed851bc6978

https://zenn.dev/peishim/articles/81a34f80685cf4

https://note.com/ym202110/n/ne3e38659f1b7