git rebase -i のサンプル実行メモ(reword, edit, squash, drop)

# はじめに
- この前、チーム内でgitの解説的な時間があり、その時に `git rebase -i` の使い方をライブプログラミング的に聞いた。今までよく分からなかったので、調べるのが面倒であまり使っていなかったのだが、この機会に色々触ってみたので、サンプルコマンドの結果をまとめたメモ
    - 	解説は無し
    - 	★が事後コメント
    - 	利用の機会がありそうな reword, edit, squash, drop が対象


# 初期状態（準備）

- テキストファイルを適当に6個([a..f].txt)作成する
- それぞれのファイルの作成に対してcommitするがb,cのみコミットをまとめておく

```zsh
% tig
16cc549 2019-05-26 15:39 kuredev          o [master] add f.txt
3e55df3 2019-05-26 15:39 kuredev          o add e.txt
16734b1 2019-05-26 15:38 kuredev          o add d.txt
00f95df 2019-05-26 15:38 kuredev          o add b.txt and c.txt
ae36142 2019-05-26 15:37 kuredev          o add a.txt
```

# reword
`add a.txt` のコミットメッセージを修正する

```
% git rebase -i HEAD~5
  1 reword ae36142 add a.txt ★rewordに修正
  2 pick 00f95df add b.txt and c.txt
  3 pick 16734b1 add d.txt
  4 pick 3e55df3 add e.txt
  5 pick 16cc549 add f.txt

:wq ★保存

  1 add a.txt by git rebase -i ★修正
  2
  3 # Please enter the commit message for your changes. Lines starting
...（省略）

:wq ★保存

%tig
f749d8b 2019-05-26 15:39 kuredev          o [master] add f.txt
bc1b2da 2019-05-26 15:39 kuredev          o add e.txt
cb4bf08 2019-05-26 15:38 kuredev          o add d.txt
1b3df3a 2019-05-26 15:38 kuredev          o add b.txt and c.txt
d7cf3d2 2019-05-26 15:37 kuredev          o add a.txt by git rebase -i ★
```

修正された。
あと、それ以後のコミットIDがすべて更新された。

# edit

## コミットを分割してみる
事前に `add b.txt and c.txt` が2つのファイルをまとめたコミットとしてあったので、これを2つのコミットに分けてみる

### 初期状態

```zsh
%tig
f749d8b 2019-05-26 15:39 kuredev          o [master] add f.txt
bc1b2da 2019-05-26 15:39 kuredev          o add e.txt
cb4bf08 2019-05-26 15:38 kuredev          o add d.txt
1b3df3a 2019-05-26 15:38 kuredev          o add b.txt and c.txt ★これを分割してみる
d7cf3d2 2019-05-26 15:37 kuredev          o add a.txt by git rebase -i
```

### rebase -i

```zsh
% git rebase -i HEAD~5
  1 pick d7cf3d2 add a.txt by git rebase -i
  2 edit 1b3df3a add b.txt and c.txt ★
  3 pick cb4bf08 add d.txt
  4 pick bc1b2da add e.txt
  5 pick f749d8b add f.txt

:wq ★保存

★この時点でログを見るとadd b.txt and c.txtのコミットまでで止まっている（という表現が正しいか不明）
% tig
1b3df3a 2019-05-26 15:38 kuredev          o [HEAD] add b.txt and c.txt
d7cf3d2 2019-05-26 15:37 kuredev          o add a.txt by git rebase -i
★ファイルの実体もある
kure@ubuntu ~/test-repo % ls
a.txt  b.txt  c.txt
```

### コミット再作成
```zsh
★コミットを1つ取り消す
% git reset HEAD^
% tig
d7cf3d2 2019-05-26 15:37 kuredev          o [HEAD] add a.txt by git rebase -i
★実体（ワーキングツリー）はある
kure@ubuntu ~/test-repo % ls
a.txt  b.txt  c.txt
★add/commitし直す
kure@ubuntu ~/test-repo % git add b.txt      
kure@ubuntu ~/test-repo % git commit -m "b.txt"    
[detached HEAD a59668d] b.txt
1 file changed, 2 insertions(+)
create mode 100644 b.txt
kure@ubuntu ~/test-repo % git add c.txt        
kure@ubuntu ~/test-repo % git commit -m "c.txt"
[detached HEAD a3bc22b] c.txt
1 file changed, 2 insertions(+)
create mode 100644 c.txt
★ rebase
kure@ubuntu ~/test-repo % git rebase --continue
```


### 確認
```
★ 確認：コミットが別れた！
kure@ubuntu ~/test-repo % tig
7123fe0 2019-05-26 15:39 kuredev          o [master] add f.txt
0cbbe5b 2019-05-26 15:39 kuredev          o add e.txt
1ad7908 2019-05-26 15:38 kuredev          o add d.txt
a3bc22b 2019-05-26 16:05 kuredev          o c.txt
a59668d 2019-05-26 16:05 kuredev          o b.txt
d7cf3d2 2019-05-26 15:37 kuredev          o add a.txt by git rebase -i
```

### コミットの内容を書き換える

### 初期状態
```zsh
kure@ubuntu ~/test-repo % tig
166a2f9 2019-05-26 15:39 kuredev          o [master] add f.txt
cbe6fa0 2019-05-26 15:39 kuredev          o add e.txt
29bed98 2019-05-26 15:38 kuredev          o add d.txt
a3bc22b 2019-05-26 16:05 kuredev          o c.txt
a59668d 2019-05-26 16:05 kuredev          o b.txt ★このコミットの内容を書き換える
★Typoしてる
kure@ubuntu ~/test-repo % cat b.txt
crate
```

### git rebase -i

```zsh
kure@ubuntu ~/test-repo % git rebase -i d7cf3d2~1
  1 pick d7cf3d2 add a.txt by git rebase -i
  2 edit a59668d b.txt ★
  3 pick a3bc22b c.txt
  4 pick 29bed98 add d.txt
  5 pick cbe6fa0 add e.txt
  6 pick 166a2f9 add f.txt
kure@ubuntu ~/test-repo % vim b.txt
kure@ubuntu ~/test-repo % cat b.txt
create
kure@ubuntu ~/test-repo %
★add/commitし直す
kure@ubuntu ~/test-repo % git add b.txt          
kure@ubuntu ~/test-repo % git commit --amend
[detached HEAD 6c86aaf] b.txt
Date: Sun May 26 16:05:05 2019 +0900
1 file changed, 2 insertions(+)
create mode 100644 b.txt
★rebase
kure@ubuntu ~/test-repo % git rebase --continue  
```

### 確認
```zsh
%tig
7f9a0bd 2019-05-26 15:39 kuredev          o [master] add f.txt
1a2c3f5 2019-05-26 15:39 kuredev          o add e.txt
7251eeb 2019-05-26 15:38 kuredev          o add d.txt
da4ddb6 2019-05-26 16:05 kuredev          o c.txt
6c86aaf 2019-05-26 16:05 kuredev          o b.txt

kure@ubuntu ~/test-repo % git show 6c86aaf  
    b.txt

diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..0cbdfe6
--- /dev/null
+++ b/b.txt
@@ -0,0 +1,2 @@
+create ★
+
★内容書き換わった！
```

# squash
- 指定したコミットを一つ前のコミットにまとめる
- b.txt と c.txt の作成のコミットを一つのコミットとしてみる
- c.txt に対して squashする

### 初期状態
```zsh
★初期状態
kure@ubuntu ~/test-repo % tig
7f9a0bd 2019-05-26 15:39 kuredev          o [master] add f.txt
1a2c3f5 2019-05-26 15:39 kuredev          o add e.txt
7251eeb 2019-05-26 15:38 kuredev          o add d.txt
da4ddb6 2019-05-26 16:05 kuredev          o c.txt
6c86aaf 2019-05-26 16:05 kuredev          o b.txt
```

### rebase -i
```
★ rebase -i
kure@ubuntu ~/test-repo % git rebase -i HEAD~5
  1 pick d7cf3d2 add a.txt by git rebase -i
  2 pick 6c86aaf b.txt
  3 s da4ddb6 c.txt ★ squash
  4 pick 7251eeb add d.txt
  5 pick 1a2c3f5 add e.txt
  6 pick 7f9a0bd add f.txt

  2 # This is the 1st commit message:
  3
  4 b.txt
  5
  6 # This is the commit message #2:
  7
  8 # c.txt ★コミットメッセージの編集：今回はコメントアウトする
```

### 確認
```
% tig
64d01fa 2019-05-26 15:39 kuredev          o [master] add f.txt
e398f2e 2019-05-26 15:39 kuredev          o add e.txt
b267e94 2019-05-26 15:38 kuredev          o add d.txt
3cc9b19 2019-05-26 16:05 kuredev          o b.txt
d7cf3d2 2019-05-26 15:37 kuredev          o add a.txt by git rebase -i
★c.txt が消えた。

★一つのコミットにまとめられてる。
kure@ubuntu ~/test-repo % git show 3cc9b19    
commit 3cc9b190ad7a390e4473b7e2360dd8afcc4d3640
Author: kuredev <@gmail.com>
Date:   Sun May 26 16:05:05 2019 +0900


    b.txt


diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..0cbdfe6
--- /dev/null
+++ b/b.txt
@@ -0,0 +1,2 @@
+create
+
diff --git a/c.txt b/c.txt
new file mode 100644
index 0000000..0cbdfe6
--- /dev/null
+++ b/c.txt
@@ -0,0 +1,2 @@
+create
+
```

# drop

### 初期状態
```zsh
★初期状態 add e.txt のコミットを消す
kure@ubuntu ~/test-repo % tig
64d01fa 2019-05-26 15:39 kuredev          o [master] add f.txt
e398f2e 2019-05-26 15:39 kuredev          o add e.txt
b267e94 2019-05-26 15:38 kuredev          o add d.txt
3cc9b19 2019-05-26 16:05 kuredev          o b.txt
```

### rebase -i
```zsh
kure@ubuntu ~/test-repo % git rebase -i HEAD~4
Successfully rebased and updated refs/heads/master.

  1 pick 3cc9b19 b.txt
  2 pick b267e94 add d.txt
  3 d e398f2e add e.txt ★
  4 pick 64d01fa add f.txt
```

### 確認
```zsh
★コミットが消えた。
kure@ubuntu ~/test-repo % tig
5059dfc 2019-05-26 15:39 kuredev          o [master] add f.txt
b267e94 2019-05-26 15:38 kuredev          o add d.txt
3cc9b19 2019-05-26 16:05 kuredev          o b.txt
d7cf3d2 2019-05-26 15:37 kuredev          o add a.txt by git rebase -i

★ eもなくなった。
kure@ubuntu ~/test-repo % ls
a.txt  b.txt  c.txt  d.txt  f.txt
```

# 参考
gitのコミットの歴史を改変する(git rebase) 1 / 2 · けんごのお屋敷 http://tkengo.github.io/blog/2013/05/16/git-rebase-reference/

[git]特定のコミットの内容を修正する - dackdive's blog https://dackdive.hateblo.jp/entry/2014/09/21/122200