最初のcommitから最後までのcommit履歴をまとめる

#最初のcommitから最後までのcommit履歴をまとめる

##環境
Git 2.9.5

##概要
下記のコマンドを使用し、最初のcommitから最後までのcommit履歴をまとめる
解説をします。

```bash:command
git rebase -i --root
```

##詳細

gitを使っていると、commit履歴を細かく分けすぎてしまい
まとめたくなることがあります。

以下は、test用のファイルのcommitを細かく分けすぎて
しまった場合です。

git log コマンドを使用しcommit履歴を見てみます。

```bash:command
git log
```


```bash:コマンドプロンプトの表示
commit 38ee2821d7a35a76e5df0d16f47e93825dd2b293
Author: sfk0105 <test@example.com>
Date:   Wed Aug 23 14:48:07 2017 +0900

    [add] test3を追加

commit fa54d389630ff5cc64ee0e534eccdccfa1d35d1f
Author: sfk0105 <test@example.com>
Date:   Wed Aug 23 14:47:32 2017 +0900

    [add] test2を追加

commit 5a0549d2ed67750cfa7dd455e1ce50f0c5242ea3
Author: sfk0105 <test@example.com>
Date:   Wed Aug 23 14:46:55 2017 +0900

    [add] test1を追加


```

今回は最初のcommit(test1)から最後のcommit(test3)までを、まとめたいと思います。
以下のコマンドを使いまとめます。

```bash:command
git rebase -i --root
```
実行すると以下の画面が表示されます。

```bash:コマンドプロンプトの表示
pick 93244e6 [add] test1を追加
pick 805ad0d [add] test2を追加
pick 416bf58 [add] test3を追加

# Rebase 416bf58 onto c108753 (3 command(s))
#
# 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
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out


```
今回はtest1からtest3まで、まとめたいので以下の変更を加ます。
変更箇所としてはtest2とtest3のpickをsquashにしただけです。

```bash:コマンドプロンプトの表示
pick 93244e6 [add] test1を追加
squash 805ad0d [add] test2を追加
squash 416bf58 [add] test3を追加

# Rebase 416bf58 onto 34c8149 (3 command(s))
#
# 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
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out


```

保存し終了すると以下の画面が表示されます。

```bash:コマンドプロンプトの表示
# This is a combination of 3 commits.
# The first commit's message is:
[add] test1を追加

# This is the 2nd commit message:

[add] test2を追加

# This is the 3rd commit message:

[add] test3を追加

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Aug 23 14:46:55 2017 +0900
#
# interactive rebase in progress; onto 34c8149
# Last commands done (3 commands done):
#    squash 805ad0d [add] test2を追加
#    squash 416bf58 [add] test3を追加
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on '34c8149'.
#
#
# Initial commit
#
# Changes to be committed:
#       new file:   test1
#       new file:   test2
#       new file:   test3
#

```
保存して終了して、logを見てみます。

```bash:command
git log
```

```bash:コマンドプロントの表示
commit a2045ad29c0c4a28a1c8a159916fc4342c81e49c
Author: sfk0105 <test@example.com>
Date:   Wed Aug 23 14:46:55 2017 +0900

    [add] test1を追加
    
    [add] test2を追加
    
    [add] test3を追加
```
commitがまとめられていることがわかります。

以上です。

##捕捉
補足として、rebase -i コマンドを使用した時に出る下記のコメントの意味を
表にしておきます。


```bash:コマンドプロンプトの表示
# 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
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

```

|コマンド |説明                                                           | 
|:-------|----------------------------------------------------------------|
| pick   | 特になにもされない                                               | 
| reword | コメントのみ修正                                                 | 
| edit   | 修正のため一時停止                                               |
| squash | 1つ前のコミットとまとめられる                                      | 
| fixup  | 1つ前のコミットとまとめられる（まとめられるコミットのコメントは消える） |                           
| exec   | シェルを使ってコマンド実行                                        | 
| drop   | コミットが、消える                                                 |