CI/CDをkatacodaで体験（初心者向け） - Part2

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

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

### <font color="Red">概要</font>
>- ```git diff```でレポジトリとワーキングディレクトリ、ステージング（オプションとして```--staged```）との差分をコードレベルで表示
- ```git log```でGitのレポジトリの履歴とコミットログを出力
- ```git show```はコミットで行われた変更を表示（前回コミットとの差分を出力）

### Step 1 - Git Status
前回の記事で説明した通り、```git status```はレポジトリの状態と異なるファイルの状態を出力します
現在のGit管理されているファイルの状態を確認

```
$ git  status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   committed.js

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        untracked.js

no changes added to commit (use "git add" and/or "git commit -a")
```

レポジトリ上に```committed.js```は存在しており、何らかの変更が加えられていると判明
一方、```untracked.js```はレポジトリ上に存在しなく、新規で作成されたため、```untracked file```と認識されています


### Step 2 - Git Diff
```git diff```はレポジトリとワーキングディレクトリ、ステージング（ステージングとの比較には```--staged```オプションを必要とする）との具体的な差分を出力します。
そのため、新規作成されたファイルは無視されます

```
$ git  diff
ESC[1mdiff --git a/committed.js b/committed.jsESC[m
ESC[1mindex 12e7e7c..fc77969 100644ESC[m
ESC[1m--- a/committed.jsESC[m
ESC[1m+++ b/committed.jsESC[m
ESC[36m@@ -1 +1 @@ESC[m
ESC[31m-console.log("Committed File")ESC[m
ESC[32m+ESC[mESC[32mconsole.log("Demostrating changing a committed file")ESC[m
```

ちなみに、```git diff```により出力される対象は現在いるディレクトリには左右されない模様

```
$ pwd
/home/scrapbook/tutorial
$ mkdir testDirectry
$ git diff testDirectry/
$ cd testDirectry/
$ git diff
ESC[1mdiff --git a/committed.js b/committed.jsESC[m
ESC[1mindex 12e7e7c..fc77969 100644ESC[m
ESC[1m--- a/committed.jsESC[m
ESC[1m+++ b/committed.jsESC[m
ESC[36m@@ -1 +1 @@ESC[m
ESC[31m-console.log("Committed File")ESC[m
ESC[32m+ESC[mESC[32mconsole.log("Demostrating changing a committed file")ESC[m
```

また、特定のファイルの差分のみ表示する場合は```git diff <file_name>```と指定すればよい

```
$ git diff untracked.js   //レポジトリに存在しないため出力されない
$ git diff committed.js
ESC[1mdiff --git a/committed.js b/committed.jsESC[m
ESC[1mindex 12e7e7c..fc77969 100644ESC[m
ESC[1m--- a/committed.jsESC[m
ESC[1m+++ b/committed.jsESC[m
ESC[36m@@ -1 +1 @@ESC[m
ESC[31m-console.log("Committed File")ESC[m
ESC[32m+ESC[mESC[32mconsole.log("Demostrating changing a committed file")ESC[m
```

### Step 3 - Git Add
ワーキングディレクトリからステージングへのファイルの移動

```
$ ls -a
.  ..  committed.js  .git  untracked.js
$ git add .   //カレントディレクトリ上のファイルを一度にステージングに移動
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   committed.js
        new file:   untracked.js

```

このようにGitでの管理対象はファイルだけでなく、ディレクトリも指定可能
特定のファイルのみステージングへ移動させる場合、```git add <file name>```に置き換える

### Step 4 - Staged Differences
step2にて```git diff```はレポジトリとの差分を具体的に出力すると説明したが、正確には**レポジトリとワーキングディレクトリの差分**を出力
ステージングとの差分を出力する場合は```--staged```オプションを必要とする

```
$ git diff committed.js   //committed.jsはワーキングディレクトリ上に存在しないので出力なし
$ git diff --staged committed.js
ESC[1mdiff --git a/committed.js b/committed.jsESC[m
ESC[1mindex 12e7e7c..fc77969 100644ESC[m
ESC[1m--- a/committed.jsESC[m
ESC[1m+++ b/committed.jsESC[m
ESC[36m@@ -1 +1 @@ESC[m
ESC[31m-console.log("Committed File")ESC[m
ESC[32m+ESC[mESC[32mconsole.log("Demostrating changing a committed file")ESC[m
```

### Step 5 - Git Log
```git log```はGitのレポジトリの履歴とコミットログを出力する

```
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   committed.js

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        untracked.js

$ git log
ESC[33mcommit 3a8c0df6d91273ebd81a5c3c2b0e76303a722395ESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[
Author: Katacoda Scenario <scenario@katacoda.com>
Date:   Sat Oct 10 09:00:32 2020 +0000

    Changed the output message in committed.js

ESC[33mcommit d006bf3fa576f22ba26ec10ff3e3dddeb27235dcESC[m
Author: Katacoda Scenario <scenario@katacoda.com>
Date:   Sat Oct 10 08:58:25 2020 +0000

    Initial Commit   //おそらくkatacodaの中でgit initが行われておりそのログと思われる
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        untracked.js

nothing added to commit but untracked files present (use "git add" to track)
```

>ここで注目するところは、**```git log```コマンドは追跡されているファイルを自動的に（内部的に）```git commit```**しているということ
と認識しているが、もし間違っていたらご指摘ください

### Step 6 - Git Show
```git log```はコミットの作成者とメッセージを示しますが、コミットで行われた変更を表示するには、コマンド```git show```を使用

```
$ git show
ESC[33mcommit 68e9f2f3b092f0133b087c8f35599c31f5cb66e8ESC[mESC[33m (ESC[mESC[1;36mHEAD -> ESC[mESC[
Author: Katacoda Scenario <scenario@katacoda.com>
Date:   Sat Oct 10 09:22:11 2020 +0000

    Changed the output message in committed.js

ESC[1mdiff --git a/committed.js b/committed.jsESC[m
ESC[1mindex 12e7e7c..fc77969 100644ESC[m
ESC[1m--- a/committed.jsESC[m
ESC[1m+++ b/committed.jsESC[m
ESC[36m@@ -1 +1 @@ESC[m
ESC[31m-console.log("Committed File")ESC[m
ESC[32m+ESC[mESC[32mconsole.log("Demostrating changing a committed file")ESC[m
```