git rebase でeditする

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

ここでは`git rebase -i [commit]`で、対話式に過去のコミットを
編集方法を説明します。

1つ前のコミットの編集は`git commit --amend`でもできるのでここでは
試しにに2つ前のコミットの編集をしてみます


editの説明
-----------

ファイルを作成

```bash
$ vi file1
add file
:wq

$ git add file1

$ git commit -m "add file1"
```

何度かファイルを更新する

```bash
$ vi file1
edit 1
:wq

$ git commit -am "edit 1"

$ vi file1
edit 2
:wq

$ git commit -am "edit 2"

$ vi file1
edit 3
:wq

$ git commit -am "edit 3"

$ vi file1
edit 4
:wq

$ git commit -am "edit 4"

$ vi file1
edit 5
:wq

$ git commit -am "edit 5"
```

ファイルを参照する

```bash
$ cat file1 
add file
edit 1
edit 2
edit 3
edit 4
edit 5
```

ログを確認する

```bash
$ git log
commit 755913b8900438b0dd7e3de48dc16abaa7cb4802
Author: ham spam
Date:   Mon May 26 17:27:12 2014 +0900

    edit 5

commit 79c4f76cad8543c0da804d59cb0f5c4e397408bc
Author: ham spam
Date:   Mon May 26 17:27:01 2014 +0900

    edit 4

commit 14eceb65a5f8cefa3cc79c68aef2b9705be23afe
Author: ham spam
Date:   Mon May 26 17:26:51 2014 +0900

    edit 3

commit cd48d27d94f749f5d2170f1a6f21e30ba90e7d6f
Author: ham spam
Date:   Mon May 26 17:26:41 2014 +0900

    edit 2

commit caa01dab4a07e488c611d6373b05072f64ac2580
Author: ham spam
Date:   Mon May 26 17:26:31 2014 +0900

    edit 1

commit b4aa1a6ba04e7d5bdfad991fd603f0c716d6220c
Author: ham spam
Date:   Mon May 26 17:26:05 2014 +0900

    add file1
```

editする

```bash
$ git rebase -i HEAD~5
pick caa01da edit 1
pick cd48d27 edit 2
edit 14eceb6 edit 3 <- これをeditする
pick 79c4f76 edit 4
pick 755913b edit 5

# Rebase b4aa1a6..755913b onto b4aa1a6
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
```

`:wq`でエディタを閉じると、下記が標準出力される

```bash
$ git rebase -i HEAD~3
Stopped at 9b5de83... edit 1
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue
```

ファイルを編集する

```bash
$ vi file1
add file
edit 3 をrebaseで編集しました <- この行を編集
```

`git commit --amend`を実行する

```bash
$ git commit --amend
```

エディタが開くのでコミットメッセージを編集する

```bash
edit 3 をrebaseで編集しました                                                        

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD^1 <file>..." to unstage)
#
#       modified:   file1
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   file1
#
```

`git rebase --continue`する

```bash
$ git rebase --continue                                    
file1: needs update
Working tree is dirty
```

ファイルを参照すると、edit4とedit5で編集した内容が消えています

```bash
$ cat file1 
add file
edit 1
edit 2
edit 3 をrebaseで編集しました
```

ログを見ると、やはりedit4とedit5で編集した内容が消えています。
rebaseで編集した後のコミットは消えちゃうのか、、、

```bash
$ git log
commit 85abeec095ff708c821d46edf555bec1612309b9
Author: ham spam
Date:   Mon May 26 17:26:51 2014 +0900

    edit 3 をrebaseで編集しました

commit cd48d27d94f749f5d2170f1a6f21e30ba90e7d6f
Author: ham spam
Date:   Mon May 26 17:26:41 2014 +0900

    edit 2

commit caa01dab4a07e488c611d6373b05072f64ac2580
Author: ham spam
Date:   Mon May 26 17:26:31 2014 +0900

    edit 1

commit b4aa1a6ba04e7d5bdfad991fd603f0c716d6220c
Author: ham spam
Date:   Mon May 26 17:26:05 2014 +0900

    add file1
```