なぞりながら復習するGitコマンド その１

## 概念

3つのエリアから構成されている

### ワーキングディレクトリ

監視されているファイルの初期位置

### ステージングエリア

addされたファイルが移動するエリア
コミットの対象になる

### リポジトリ

コミットされたファイルが格納される場所

## Gitツアー

では早速、作業をするフォルダを作成しましょう

```
$ mkdir git-tour
$ cd git-tour/
```

### `git status`

リポジトリの状態を確認するコマンド。おなじみですね。

```
$ git status
fatal: Not a git repository (or any of the parent directories): .git
```

現在はまだ何もしていないので、Gitリポジトリがないと言われます。

### `git init`

リポジトリを作成するコマンド

あながち間違いじゃないが、今までgitの初期化のコマンドとしか認識していなかったが
ローカルにリポジトリを作成するコマンドらしい。

##### リポジトリ作る

```
$ git init
Initialized empty Git repository in /Users/xxxxxx/xxxxxx/git-tour/.git/
```

`git init`を実行すると`.git`が作成され、ここにリポジトリに関する情報が管理される。

```
$ git status
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)
```

つまり`.git`を削除すればリポジトリは削除される

```
$ rm -rf .git/
$ git status
fatal: Not a git repository (or any of the parent directories): .git
```

元に戻しましょう

```
$ git init
```

適当なファイルを作ってみましょう

```
$ echo 'Hello World' > text.md
$ ls
text.md
```

```
$ git status
On branch master

Initial commit

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

	text.md

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

ディレクトリ内で何かファイルの作成なり編集なり削除されるとまず`ワーキングディレクトリ`と言うエリアに属することになる`Untracked files:`となっているのが目印だ。

ワーキングディレクトリのファイルを削除するには`git clean`を使用します。
`git clean`を使用するとワーキングディレクトリ内のファイルを一掃することができます。

```
#削除の対象のファイルを確認
$ git clean -n
Would remove text.md

#実行
$ git clean -f
Removing text.md
```


これをコミットの対象となるステージングに移動するには`git add`を使用する。

### `git add`

ステージングにファイルを追加するコマンド

```
#ファイルをステージングに追加
git add <ファイル名>

#複数ファイルを追加
git add <ファイル名> <ファイル名> <ファイル名> <ファイル名>

#すべてのファイルを追加
git add .
```

#### `text.md`をステージングエリアに追加する

```
$ echo 'Hello World' > text.md
$ git add text.md
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   text.md

```

`Changes to be committed:`がステージングエリアにいるファイルの目印です。

#### ステージングエリアのファイルをワーキングディレクトリに戻す

### `git reset`

`git reset`でステージングエリアのファイルをワーキングディレクトリに戻すことができる。

```
$ git reset text.md 
$ git status
On branch master

Initial commit

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

	text.md

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

#### ステージングエリアに追加した後同ファイルを更新していた場合

```
$ git add text.md 
$ echo 'Hello Git' > text.md
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   text.md

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:   text.md

$ cat text.md 
Hello Git

```

この状態で`git reset`した場合

```
$ git reset text.md
$ git status
On branch master

Initial commit

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

	text.md

nothing added to commit but untracked files present (use "git add" to track)
$ cat text.md 
Hello Git

```

`text.md`は最新の状態のまま
ステージングエリアのファイルの状態をワーキングディレクトリに上書きする場合は`git checkout`を使用する


```
$ echo 'Hello Staging Erea' > text.md
$ git add text.md 
$ echo 'Hello Working Directory' > text.md
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   text.md // Hello Staging Erea

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:   text.md // Hello Working Directory

```

```
$ cat text.md
Hello Working Directory

$ git checkout text.md 

$ cat text.md
Hello Staging Erea

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   text.md

```

#### リポジトリにコミット

### `git commit`

リポジトリにコミットするには`git commit`を使用、ステージングエリアにいるファイルをコミットします。

```
$ git commit -m "text.mdを作成"
[master (root-commit) 966a537] text.mdを作成
 1 file changed, 1 insertion(+)
 create mode 100644 text.md

```


`text.md`を少し編集してみましょう。

```
$ echo 'Hello New World' > text.md
$ cat text.md 
Hello New World
```

### `git diff`

現在の編集とリポジトリの差分を見るには`git diff`を使用します。

```
$ git diff
diff --git a/text.md b/text.md
index 5b33845..d9786ef 100644
--- a/text.md
+++ b/text.md
@@ -1 +1 @@
-Hello Staging Erea
+Hello New World

```

ステージングエリアへの追加とコミットを一つのコマンドで実行できる方法もあります。
この場合ワーキングディレクトリ内のファイル全てが対象になります。

```
$ git commit -a -m "text.mdを編集"
[master 83f0b1a] text.mdを編集
 1 file changed, 1 insertion(+), 1 deletion(-)
```

### `git log`

`git log`ではコミットのログを確認できます。

```
$ git log
commit 83f0b1ac966094d4c2afafa22ffff04f2b204306
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:20:14 2017 +0900

    text.mdを編集

commit 966a53756321340db3e4f27b6cd8a5e44a5f26bf
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:14:34 2017 +0900

    text.mdを作成

```

直前のコミット編集することもできます。
`Hello New World`で編集したが、!が抜けていた。
だけど追加でコミットしたくない時に便利なのが`git commit --amend`

```
$ echo 'Hello New World!' > text.md
$ git add text.md
$ git commit --amend
[master 3e33a46] text.mdを編集
 Date: Thu Dec 28 06:20:14 2017 +0900
 1 file changed, 1 insertion(+), 1 deletion(-)
```

また`git commit --amend`を実行するとvimが起動するので、編集の内容修正のみの場合はそのまま閉じる、
コミットメッセージを修正したい場合はvimで修正が可能。

```
$ git log
commit 3e33a4602ad09b97811a45bc5d8ea04537e8f107
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:20:14 2017 +0900

    text.mdを編集

commit 966a53756321340db3e4f27b6cd8a5e44a5f26bf
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:14:34 2017 +0900

    text.mdを作成

```

ログが変わってないのがわかる。

### `git revert`

コミットを打ち消すコミットを作成することができる

```
commit 3e33a4602ad09b97811a45bc5d8ea04537e8f107
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:20:14 2017 +0900

    text.mdを編集
```

このコミットをリバートする場合

```
$ git revert 3e33a4602ad09b97811a45bc5d8ea04537e8f107
$ cat text.md 
Hello Staging Erea
```

```
$ git log
commit 531eda295dbc2ad586c09d2882fc6fc202009cf7
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:32:36 2017 +0900

    Revert "text.mdを編集"
    
    This reverts commit 3e33a4602ad09b97811a45bc5d8ea04537e8f107.

commit 3e33a4602ad09b97811a45bc5d8ea04537e8f107
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:20:14 2017 +0900

    text.mdを編集

commit 966a53756321340db3e4f27b6cd8a5e44a5f26bf
Author: stivan622 <stivan.tr@gmail.com>
Date:   Thu Dec 28 06:14:34 2017 +0900

    text.mdを作成

```

次回はリモートリポジトリが絡んだ場合の操作を復習します〜