CI/CDをkatacodaで体験（初心者向け） - Part9(Re-writing History)

# CI/CD入門
このぺーじでは、[katacoda](https://www.katacoda.com/)と呼ばれる「ブラウザから無料で勉強用のインスタンスを起動できるWebサービス」を利用してCI/CDを実践します
内容は上記リンクに沿うので、不明点があればそちらへどうぞ

## Gitのバージョン管理について - Scenario 9 - Re-writing History
ここでは、CI/CDとして欠かせないGitによるバージョン管理について学習します
このシナリオで学習することをさっと確認する場合は**概要**を確認
**理解に間違い等がございましたら、ぜひご指摘ください**

### <font color="Red">概要</font>
>- ```git rebase --interactive (--root)```でレポジトリの履歴を変更可能
- リポジトリの変更方法の流れ
    1. ```git rebase --interactive (--root) (hash)```
    2. 対象のバージョンに対しての操作（コマンド等）を要求
    3. 具体的な変更内容の記述
- e.g ) [commitコメントの変更](#amending-commit-messages)
- e.g ) [commitの統合](#squash-commits)
- e.g ) [commitの順序入れ替え](#re-order-commits)
- e.g ) [commitの分割](#split-commit)

### Amending Commit Messages
リポジトリの履歴の可読性を向上させるため、```git rebase```を用いて整理する
今回のシナリオはcommitの内容を変更
初期状態のcommit履歴は以下の通り

```
$ git log --oneline
ESC[33m254883aESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m Final Item
ESC[33mb1a5bb4ESC[m New Item
ESC[33m0c3ff30ESC[m Initial comit of the list
```

```git rebase --interactive --root```でインタラクティブモードでrootユーザとしてレポジトリを編集する
このコマンドを打ち込むと、以下のようなVimが立ち上がる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/e36f702a-3cc7-0d9b-4973-e4ffcb24194a.png)

今回は"comit"とコメントされているコミットを編集するので以下のように```reword```を要求し```esc```,```:wq```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/25428404-2f5c-0ba9-fd8c-a4a92b314e07.png)

すると新たに以下のようなVimが立ち上がる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/78f2e539-3f7e-abbe-7779-dca38460b4bc.png)

ここで、"reword"要求のcommitメッセージの変更が可能
今回は以下の通り、```comit```->```commit```に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/e367906e-3e79-ea8b-681f-30958fb65326.png)

terminalに戻ってきたら、変更が反映されている

```
$ git rebase --interactive --root
[detached HEAD d1cc84f] Initial commit of the list
 Date: Tue Oct 20 07:21:12 2020 +0000
 1 file changed, 5 insertions(+)
 create mode 100644 list.html
Successfully rebased and updated refs/heads/master.
$ git log --oneline
ESC[33m8081e1dESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m Final Item
ESC[33mc6dc2adESC[m New Item
ESC[33md1cc84fESC[m Initial commit of the list   //"comit"->"commit"
```

### Squash Commits
続いてのシナリオでは、複数のcommitをひとつにまとめる
リポジトリの初期状態は以下の通り

```
$ git log --oneline
ESC[33m1cf8e31ESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m TODO
ESC[33ma340728ESC[m TODO
ESC[33m901fe75ESC[m TODO
ESC[33m6b4db09ESC[m TODO
ESC[33mfbf4a5dESC[m TODO
ESC[33m52204d0ESC[m TODO
ESC[33mf8f4e01ESC[m TODO
ESC[33m260d2cbESC[m TODO
ESC[33m3a1f752ESC[m Final Item
ESC[33mf74f00dESC[m New Item
ESC[33mfabfbbaESC[m Initial comit of the list
$ git rebase --interactive HEAD~8
```

今回は前のcommitに別のcommitを融合するので```squash/s```に要求を変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/77b0f9d8-cd85-6292-6ad2-c5381da9df10.png)

その後、以下のように一つ目のcommitメッセージのみを残して保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/c4c92960-8791-08a0-2622-acbcff5124be.png)

```
[detached HEAD d957dad] TODO
 Date: Tue Oct 20 07:43:38 2020 +0000
 1 file changed, 8 insertions(+)
 create mode 100644 TODO
Successfully rebased and updated refs/heads/master.
$ git log --oneline
ESC[33md957dadESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m TODO
ESC[33m3a1f752ESC[m Final Item
ESC[33mf74f00dESC[m New Item
ESC[33mfabfbbaESC[m Initial comit of the list
```

commitメッセージが"TODO"一つに変更されていることを確認

### Re-order Commits
続いてのシナリオでは、commitの順序を入れ替える
リポジトリの初期状態は以下の通り

```
$ git log --oneline
ESC[33m356b8fdESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m Adding File 1
ESC[33maa0b258ESC[m Adding File 2
ESC[33md957dadESC[m TODO
ESC[33m3a1f752ESC[m Final Item
ESC[33mf74f00dESC[m New Item
ESC[33mfabfbbaESC[m Initial comit of the list
$ git rebase --interactive HEAD~2
```

今回は、"pick"要求のままでよいが、順序のみを入れ替える

```
Successfully rebased and updated refs/heads/master.
$ git log --oneline
ESC[33md49ad2bESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m Adding File 2
ESC[33mb533037ESC[m Adding File 1
ESC[33md957dadESC[m TODO
ESC[33m3a1f752ESC[m Final Item
ESC[33mf74f00dESC[m New Item
ESC[33mfabfbbaESC[m Initial comit of the list
```

### Split Commit
続いてのシナリオでは、commitの分割を行う
リポジトリの初期状態は以下の通り

```
$ git log --oneline
ESC[33me957a8bESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m Adding Fil
ESC[33m6141321ESC[m Adding File 1
ESC[33mb150469ESC[m Adding File 2
ESC[33m2f349e4ESC[m TODO
ESC[33me5a591fESC[m TODO
ESC[33mf7de1a0ESC[m TODO
ESC[33m5637843ESC[m TODO
ESC[33m0c4df92ESC[m TODO
ESC[33m846e96dESC[m TODO
ESC[33mec5bac6ESC[m TODO
ESC[33m69440bcESC[m TODO
ESC[33me5197fdESC[m Final Item
ESC[33mdbef64cESC[m New Item
ESC[33md6dc0e6ESC[m Initial comit of the list
$ git rebase --interactive HEAD~1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/ceaadd1e-b136-45e9-d0e9-559fffe7ffaf.png)

今回は```rebase```の```edit```を要求

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/d51ddf7e-651e-aeb2-71d9-8dd65ff190c4.png)

下記の結果の通り、一時的に```rebase```が停止

```
Stopped at e957a8b...  Adding File 3 and File 4
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue
$ git reset HEAD^   //分割commitをリセット
$ git add file3.txt
$ git commit -m "File 3"
[detached HEAD f491f57] File 3
 1 file changed, 1 insertion(+)
 create mode 100644 file3.txt
$ git add file4.txt
$ git commit -m "File 4"
[detached HEAD 67edd65] File 4
 1 file changed, 1 insertion(+)
 create mode 100644 file4.txt
$ git rebase --continue   //一時停止していたrebaseを再度実行
Successfully rebased and updated refs/heads/master.
$ git log --oneline
ESC[33m67edd65ESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[1;32mmasterESC[mESC[33m)ESC[m File 4
ESC[33mf491f57ESC[m File 3
ESC[33m6141321ESC[m Adding File 1
ESC[33mb150469ESC[m Adding File 2
ESC[33m2f349e4ESC[m TODO
ESC[33me5a591fESC[m TODO
ESC[33mf7de1a0ESC[m TODO
ESC[33m5637843ESC[m TODO
ESC[33m0c4df92ESC[m TODO
ESC[33m846e96dESC[m TODO
ESC[33mec5bac6ESC[m TODO
ESC[33m69440bcESC[m TODO
ESC[33me5197fdESC[m Final Item
ESC[33mdbef64cESC[m New Item
ESC[33md6dc0e6ESC[m Initial comit of the list
```

上記の結果の通り、```rebase```を一時停止している間に対象のcommitをリセットしその内容を通常通り、commitすることでcommitの分割を実現