あ！間違えてPRをマージしちゃった！ってときにリバートする方法

## はじめに
Gitと使って開発しているとPRを作成してレビューしてもらうことがあると思います。
そして、間違えて自分でマージしちゃうこともあると思います。

そんなときのために、マージを取り消す方法をまとめて見ました。
Github上でボタンをポチポチ押すだけで簡単にできます。

## ブランチとPR
### ブランチ
今回は`master`ブランチと`test1`ブランチを用意します。
`master`: initial commitのみ
`test1ブランチ`: masterから切って、"test1"というメッセージでコミット

### PR
test1をmasterに向けてPRを作成しました。(master ← test1)


## リバート(revert)する方法
### 1. マージしてしまったPRから`revert`ボタンを押す
マージした後は下記のような画面になっていると思いますが、その中にある`revert`ボタンを押します。

![スクリーンショット 2020-11-21 11.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/4c3c89d1-700d-aa24-09b6-8a1007f3a2e1.png)

### 2. mergeを打ち消すPRを作成する
`revert`ボタンを押すと、mergeを打ち消すブランチとPRが自動的に作成されます。

![スクリーンショット 2020-11-21 11.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/b5940212-cfbd-1946-5bc4-a248386e4af2.png)

### 3. mergeを打ち消すPRをmergeする
PRを作成すると`Merge pull request`ボタンがあるのでそれを押します。

![スクリーンショット 2020-11-21 11.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/174fb5e6-653e-88d0-efd4-36d0eab4218c.png)

### 4. mergeを打ち消すbranchを削除
必須ではないですが、mergeを打ち消すブランチを削除しておきます。(`Delete Branch`を押す)


![スクリーンショット 2020-11-21 11.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/67a9d613-7c01-3d9e-4982-47b9caa2ab0b.png)

### 5. 確認
ブランチを見ると`master`と`test1`のみでmergeを打ち消すブランチはありません

![スクリーンショット 2020-11-21 11.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/ff4cc81a-7b1c-3867-24b8-b5da1e678f46.png)

コミットはこんな感じになっています。

- 間違えてしまったマージ
- リバート
- マージを打ち消すマージ
![スクリーンショット 2020-11-21 11.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/46b02bab-b842-05ee-7a1b-6b70a23dba00.png)

## revertしたブランチを再度PRに出したい時
revertしてもう一度PRを出そうとしても差分がなくPRが出せない状態になっています。

![スクリーンショット 2020-11-21 15.26.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/23298dae-abf2-f2d4-da82-9cd04b00de87.png)


もう一度PRを出せるようにするには、revertをrevertする必要があるらしい。。。(何をしているかは正直わかっていません。。。)

masterに移動してまずはlogを確認。
(何度か試していて違うコミットになっているので、私の場合上の写真のcommit idと下のcommit idが異なっています。通常は一緒です。)


```
$ git checkout master

$ git pull # git上でmerge/revertしているのでpullが必要です。

$ git log --oneline
50b197d (HEAD -> master, origin/master) Merge pull request #2from shungo0525/revert-1-test1
0373b56 Revert "test1"
44a8c4b Merge pull request #1 from shungo0525/test1
13740b6 (origin/test1, test1) test1
a78da6f initial commit
```

test1にmasterをmergeします。

```
$ git checkout test1
$ git merge master
$ git log --oneline # logで確認

50b197d (HEAD -> master, origin/master) Merge pull request #2 from shungo0525/revert-1-test1
0373b56 Revert "test1"
44a8c4b Merge pull request #1 from shungo0525/test1
13740b6 (origin/test1, test1) test1
a78da6f initial commit
```

ここからがrevertをrevertする手順

```
$ git revert 50b197d -m 1
$ git log --oneline
2fb9657 (HEAD -> test1) Revert "Merge pull request #2 from shungo0525/revert-1-test1"
50b197d (origin/master, master) Merge pull request #2 from shungo0525/revert-1-test1
0373b56 Revert "test1"
44a8c4b Merge pull request #1 from shungo0525/test1
13740b6 (origin/test1) test1
a78da6f initial commit
```

そして最後にpush

```
$ git push
```

すると無事にPRが出せるようになりました。

![スクリーンショット 2020-11-21 15.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/1611e130-b990-cfee-e2cf-3c019531a377.png)

## おわりに
間違えてしまっても、戻す方法はあるので、落ち着いて対処しましょう。