Gitのリベース操作について

# リベースの基本操作について

### リベース(rebase)でできること

操作イメージ

```
(Before)
          A---B---C test
         /
    D---E---F---G master

(After)
                  A'--B'--C' test
                 /
    D---E---F---G master
```

操作コマンド

```shell
# 現在のブランチの確認
git branch --contains

# ブランチの切替
git checkout test

# リベースの実行
git rebase master
```

▼実行前

```shell
* bbac238 - add sample4.txt (HEAD -> test) (6 minutes ago:2020-06-16 14:17:47 +0900) <Erika>
* 770ae3b - add sample3.txt (7 minutes ago:2020-06-16 14:16:39 +0900) <Erika>
| * f3bf129 - add sample2.txt (master) (7 minutes ago:2020-06-16 14:17:16 +0900) <Erika>
| * 1241db9 - add sample1.txt (8 minutes ago:2020-06-16 14:15:51 +0900) <Erika>
|/  
* 5f09f67 - initial commit (origin/master) (3 hours ago:2020-06-16 11:10:42 +0900) <Erika>
```
▼実行後

```shell
* 380e11d - add sample4.txt (HEAD -> test) (5 seconds ago:2020-06-16 14:24:16 +0900) <Erika>
* fd4e19b - add sample3.txt (5 seconds ago:2020-06-16 14:24:16 +0900) <Erika>
* f3bf129 - add sample2.txt (master) (7 minutes ago:2020-06-16 14:17:16 +0900) <Erika>
* 1241db9 - add sample1.txt (9 minutes ago:2020-06-16 14:15:51 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (3 hours ago:2020-06-16 11:10:42 +0900) <Erika>
```

### 何が起こっているか
1.testにはあるが、masterには無いコミットが一時退避される
2.masterに移動
3.1.で退避したコミットを再適用

# リベースのオプションについて

### 指示コマンド一覧

| コマンド       |       説明 |
|:-----------------|:------------------|
| (p)pick             |    コミットをそのまま残す。デフォルト。          |
|  (r)reword         |     コミットメッセージを変更。       |
|  (e)edit           |       コミット自体の内容を編集。       |
|  (s)squash           |      直前のpickを指定したコミットに統合。メッセージも統合。        |
|   (f)fixup          |        直前のpickを指定したコミットに統合。メッセージは破棄。      |

### Reword

操作コマンド

```shell
# rebaseの実行
git rebase -i 5f09f67        # 一番古いチェックポイントを選択するのがポイント

# オプションステータスを変更
reword e728b16 add test text
reword e08fe63 add test2 text

# コミットメッセージの変更
add test text aaa
add test2 text bbb
```

▼実行前

```shell
* 686d1fe - add test2 text (HEAD -> master) (25 minutes ago:2020-06-16 11:24:36 +0900) <Erika>
* e728b16 - add test text (38 minutes ago:2020-06-16 11:12:15 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (39 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```


▼実行後

```shell
* a76999e - add test2 text bbb (HEAD -> master) (44 seconds ago:2020-06-16 12:04:43 +0900) <Erika>
* dafdee3 - add test text aaa (60 seconds ago:2020-06-16 12:04:27 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (55 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```

### Edit

操作コマンド

```shell
# rebaseの実行
git rebase -i 5f09f67        # 一番古いチェックポイントを選択するのがポイント

# オプションステータスを変更
edit e728b16 add test text
edit e08fe63 add test2 text

# e728b16のコミットを編集(ファイル追加&コミットメッセージの変更)
$ touch sample2.txt
$ git commit --amend -m 'add file sample2.txt'
$ git rebase --continue

# 686d1feのコミットを編集(ファイル追加&コミットメッセージの変更)
$ touch sample3.txt
$ git commit --amend -m 'add file sample3.txt'
$ git rebase --continue

```

▼実行前

```shell
* 686d1fe - add test2 text (HEAD -> master) (25 minutes ago:2020-06-16 11:24:36 +0900) <Erika>
* e728b16 - add test text (38 minutes ago:2020-06-16 11:12:15 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (39 minutes ago:2020-06-16 11:10:42 +0900) <Erika>

$ ls -la
drwxr-xr-x   - erika 16 6 12:07 .git
.rw-r--r-- 297 erika 16 6 11:08 .gitconfig
.rw-r--r--   5 erika 16 6 12:07 sample.txt
```

▼実行後

```shell
* ee7f98e - add file sample3.txt (HEAD -> master) (17 seconds ago:2020-06-16 12:09:47 +0900) <Erika>
* 8f4c1e2 - add file sample2.txt (76 seconds ago:2020-06-16 12:08:48 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (59 minutes ago:2020-06-16 11:10:42 +0900) <Erika>

$ ls -la
drwxr-xr-x   - erika 16 6 12:08 .git
.rw-r--r-- 297 erika 16 6 11:08 .gitconfig
.rw-r--r--  11 erika 16 6 12:08 sample.txt
.rw-r--r--   0 erika 16 6 12:08 sample2.txt
.rw-r--r--   0 erika 16 6 12:09 sample3.txt
```

### Squash

操作コマンド

```shell
# rebaseの実行
git rebase -i 5f09f67        # 一番古いチェックポイントを選択するのがポイント

# オプションステータスの変更
pick e728b16 add test text   # 一番古いコミットはpickのままにすることがポイント
squash 686d1fe add test2 text

# コミットメッセージの編集
# This is the 1st commit message:
# add test text

# This is the commit message #2:
# add test2 text

add test text sq             # 新しいコミットメッセージを記載
```

▼実行前

```shell
* 686d1fe - add test2 text (HEAD -> master) (25 minutes ago:2020-06-16 11:24:36 +0900) <Erika>
* e728b16 - add test text (38 minutes ago:2020-06-16 11:12:15 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (39 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```

▼実行後

```shell
* 89a32e7 - add test text sq (HEAD -> master) (4 minutes ago:2020-06-16 11:54:10 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (48 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```

### Fixup

操作コマンド

```shell
# rebaseの実行
git rebase -i 5f09f67        # 一番古いチェックポイントを選択するのがポイント

# オプションステータスの変更
pick e728b16 add test text   # 一番古いコミットはpickのままにすることがポイント
fixup 686d1fe add test2 text
```

▼実行前

```shell
* 686d1fe - add test2 text (HEAD -> master) (4 seconds ago:2020-06-16 11:24:36 +0900) <Erika>
* e728b16 - add test text (12 minutes ago:2020-06-16 11:12:15 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (14 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```

▼実行後

```shell
* 50039c2 - add test text (HEAD -> master) (5 seconds ago:2020-06-16 11:44:09 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (34 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```


# その他のrebaseコマンド

### 実行を元に戻す

操作コマンド

```shell
* 50039c2 - add test text (HEAD -> master) (5 seconds ago:2020-06-16 11:44:09 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (34 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```

▼実行前

```shell
$ git reset --hard 686d1fe
```

▼実行後

```shell
* 686d1fe - add test2 text (HEAD -> master) (25 minutes ago:2020-06-16 11:24:36 +0900) <Erika>
* e728b16 - add test text (38 minutes ago:2020-06-16 11:12:15 +0900) <Erika>
* 5f09f67 - initial commit (origin/master) (39 minutes ago:2020-06-16 11:10:42 +0900) <Erika>
```

### rebaseを中止する

```shell
# rebaseを中止する
git rebase --abort
```