git revertでマージコミットの取り消しを行う

はじめに
---------

`git revert`でマージコミットの取り消しを実施した場合に、履歴が
どうなるかを確認しました。

ここでは分岐元ブランチを**master**、分岐先ブランチを**topic**とします。

マージコミットの取り消し
-------------------------

masterブランチでファイルを作成

```bash
$ touch master_file1                             
$ git add master_file1 
$ git commit -m "add master_file1"
```

topicブランチにcheckout

```bash
$ git checkout -b topic
$ git branch -l                                  
  master
* topic
```

topicブランチでいくつかcommitする

```bash
$ touch topic_file1
$ git add topic_file1                            
$ git commit -m "add topci_file1"

$ touch topic_file2
$ git add topic_file2
$ git commit -m "add topci_file2"

$ touch topic_file3
$ git add topic_file3
$ git commit -m "add topci_file3"
```

masterブランチにcheckoutし、一回コミットする

```bash
$ git checkout master
$ git branch -l
* master
  topic

$ touch master_file2
$ git add master_file2
$ git commit -m "add master_file2"
```

topicブランチをマージする

```bash
$ git merge topic
Merge made by recursive.
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 topic_file1
 create mode 100644 topic_file2
 create mode 100644 topic_file3
```

ログを確認する

```bash
$ git log --graph
*   commit ecc627c4ec21d56880c43d70ed9c651fc27bb2ac
|\  Merge: 7611117 8998d77
| | Author: spam ham
| | Date:   Fri Apr 25 19:09:41 2014 +0900
| | 
| |     Merge branch 'topic'
| |   
| * commit 8998d77d981f1410201b44e83c3640922bd8941f
| | Author: spam ham
| | Date:   Fri Apr 25 18:42:45 2014 +0900
| | 
| |     add topic_file3
| |   
| * commit cc62d621e45b462469c2b42c932e437ff1bf2fd1
| | Author: spam ham
| | Date:   Fri Apr 25 18:42:23 2014 +0900
| | 
| |     add topic_file2
| |   
| * commit b91fa995c57a94a7a12d70fed70be73aa089dd2c
| | Author: spam ham
| | Date:   Fri Apr 25 18:41:56 2014 +0900
| | 
| |     add topic_file1
| |   
* | commit 761111709af04a7e736d6ca6a1ac23ccaac94781
|/  Author: spam ham
|   Date:   Fri Apr 25 19:08:25 2014 +0900
|   
|       add master_file2
|  
* commit 02c3bd6497e4d9e43117e9802b86af204f063657
  Author: spam ham
  Date:   Fri Apr 25 18:37:02 2014 +0900
  
      add master_file1
```

マージコミットを取り消す

> マージコミットをrevertする場合は、2つのブランチのうちどちらを
> 残すのか指定します。
> ここでは**ecc627c**が取り消したいマージコミットで、**7611117**を
> 含むブランチが残したいブランチだとします。
> **ecc627c**のログを見ると`Merge: 7611117 8998d77`とあるので
> 親コミット**7611117**が親番号1、親コミット**8998d77**が親番号2となります。
> `git revert -m`で残したい親番号を指定することで、マージコミットの
> 取り消しが可能となります。

```bash
$ git revert -m 1 ecc627c --no-edit
Finished one revert.
[master c77f6c6] Revert "Merge branch 'topic'"
 0 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 topic_file1
 delete mode 100644 topic_file2
```

ログを確認する

```bash
$ git log --graph
* commit c77f6c6303699fa0b06b25d1becb7d44d0c5716b
| Author: spam ham
| Date:   Fri Apr 25 19:18:32 2014 +0900
| 
|     Revert "Merge branch 'topic'"
|     
|     This reverts commit ecc627c4ec21d56880c43d70ed9c651fc27bb2ac, reversin
|     changes made to 761111709af04a7e736d6ca6a1ac23ccaac94781.
|    
*   commit ecc627c4ec21d56880c43d70ed9c651fc27bb2ac
|\  Merge: 7611117 8998d77
| | Author: spam ham
| | Date:   Fri Apr 25 19:09:41 2014 +0900
| | 
| |     Merge branch 'topic'
| |   
| * commit 8998d77d981f1410201b44e83c3640922bd8941f
| | Author: spam ham
| | Date:   Fri Apr 25 18:42:45 2014 +0900
| | 
| |     add topic_file3
| |   
| * commit cc62d621e45b462469c2b42c932e437ff1bf2fd1
| | Author: spam ham
| | Date:   Fri Apr 25 18:42:23 2014 +0900
| | 
| |     add topic_file2
| |   
| * commit b91fa995c57a94a7a12d70fed70be73aa089dd2c
| | Author: spam ham
| | Date:   Fri Apr 25 18:41:56 2014 +0900
| | 
| |     add topic_file1
| |   
* | commit 761111709af04a7e736d6ca6a1ac23ccaac94781
|/  Author: spam ham
|   Date:   Fri Apr 25 19:08:25 2014 +0900
|   
|       add master_file2
|  
* commit 02c3bd6497e4d9e43117e9802b86af204f063657
  Author: spam ham
  Date:   Fri Apr 25 18:37:02 2014 +0900
  
      add master_file1
```

作業ツリーにあるファイルを確認する

```bash
$ ls                                             
master_file1  master_file2
```

補足
-----

> 上記例では親番号1を残す対象にしましたが、親番号2を残す対象にしたら
> どうなるのかも確認しました。

> 下記の実行結果を見るとわかりますが、`git revert`後は**7611117**で作成した
> ファイル`master_file2`が作業ツリーから消えています。

```bash
$ git revert -m 2 ecc627c4 --no-edit
Finished one revert.
[detached HEAD c577704] Revert "Merge branch 'topic'"
 0 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 master_file2

* commit c5777047cb99a72060cf94b59b2ae64fd507b981
| Author: spam ham
| Date:   Fri Apr 25 19:41:30 2014 +0900
| 
|     Revert "Merge branch 'topic'"
|     
|     This reverts commit ecc627c4ec21d56880c43d70ed9c651fc27bb2ac, rever
|     changes made to 8998d77d981f1410201b44e83c3640922bd8941f.
|    
*   commit ecc627c4ec21d56880c43d70ed9c651fc27bb2ac
|\  Merge: 7611117 8998d77
| | Author: spam ham
| | Date:   Fri Apr 25 19:09:41 2014 +0900
| | 
| |     Merge branch 'topic'
| |   
| * commit 8998d77d981f1410201b44e83c3640922bd8941f
| | Author: spam ham
| | Date:   Fri Apr 25 18:42:45 2014 +0900
| | 
| |     add topic_file3
| |   
| * commit cc62d621e45b462469c2b42c932e437ff1bf2fd1
| | Author: spam ham
| | Date:   Fri Apr 25 18:42:23 2014 +0900
| | 
| |     add topic_file2
| |   
| * commit b91fa995c57a94a7a12d70fed70be73aa089dd2c
| | Author: spam ham
| | Date:   Fri Apr 25 18:41:56 2014 +0900
| | 
| |     add topic_file1
| |   
* | commit 761111709af04a7e736d6ca6a1ac23ccaac94781
|/  Author: spam ham
|   Date:   Fri Apr 25 19:08:25 2014 +0900
|   
|       add master_file2
|  
* commit 02c3bd6497e4d9e43117e9802b86af204f063657
  Author: spam ham
  Date:   Fri Apr 25 18:37:02 2014 +0900
      add master_file1


$ ls
master_file1  topic_file1  topic_file2  topic_file3
```