git add, git init, git commit  はリポジトリ配下で何をしているのか?

git管理する時にみんな実行する3つのコマンド、git init,git add git commit をすると、どんな動きがあるのかを確認してみたいと思います。

## リポジトリ作成

まずリポジトリの元となるディレクトリを作成します。

```bash
% mkdir gitstudy 
cd gitstudy
```

gitstudyというディレクトリを作成し、そこに移動します。

ここでtreeコマンドでディレクトリツリーを確認してみましょう。
ドットファイルが見れるように オプションに -a をつけます。

```bash
% tree -a                                                                                                                     9:12:17
.

0 directories, 0 files
```
ディレクトリを作成しただけなので、もちろんファイルはまだ何もありません。

git init を実行し、gitリポジトリとして登録します。

```bash
% git init                                                                                                                   9:16:31
Initialized empty Git repository in /Users/guai3/MyDevelopment/StudyWorkshop/gitstudy/.git/
```

ここで先ほどと同じくtreeコマンドでディレクトリツリーを確認してみましょう。

```bash
% tree -a                                                                                                     
.
└── .git
    ├── HEAD
    ├── config
    ├── description
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── prepare-commit-msg.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

9 directories, 14 files
```
.git という不可視ディレクトリが作成され、配下にこれだけのファイルが作成されました。
どうやら、git init と言うコマンドは実行されたディレクトリに.gitというディレクトリを作成し、
これだけのファイルを作成するのが、コマンドで行っていることの様に見えます。
では今度はファイルを作成してみます。
gitはテキストファイルの管理が得意なので、空のテキストファイルを作成してみましょう。

```bash
% touch gittest1.txt
% tree -a                                                                                                     (git)-[master] 9:38:41
.
├── .git
│   ├── HEAD
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-commit.sample
│   │   ├── pre-push.sample
│   │   ├── pre-rebase.sample
│   │   ├── pre-receive.sample
│   │   ├── prepare-commit-msg.sample
│   │   └── update.sample
│   ├── index
│   ├── info
│   │   └── exclude
│   ├── objects
│   │   ├── info
│   │   └── pack
│   └── refs
│       ├── heads
│       └── tags
└── gittest1.txt
9 directories, 15 files
```
ファイルを作成しただけなので、ファイル数が14から15に増えただけです。
今度はこのファイルをgit add . してgit管理の対象とします。

```
% git add .
% tree -a                                                                                                    
.
├── .git
│   ├── HEAD
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-commit.sample
│   │   ├── pre-push.sample
│   │   ├── pre-rebase.sample
│   │   ├── pre-receive.sample
│   │   ├── prepare-commit-msg.sample
│   │   └── update.sample
│   ├── index
│   ├── info
│   │   └── exclude
│   ├── objects
│   │   ├── e6
│   │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   │   ├── info
│   │   └── pack
│   └── refs
│       ├── heads
│       └── tags
└── gittest1.txt

10 directories, 17 files
```
object ディレクトリの配下に e6 というディレクトリが作成されました。
その下にあるファイルが gittest1.txtの実体のようにみえます。

今度はgit commit をしてみます。

```
% git commit -m "first commit"                                                                                        (git)-[master] 12:33:16
[master (root-commit) 538dd7f] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 gittest1.txt
```
treeコマンドで確認しましょう。

```
% tree -a                                                                                                             (git)-[master] 12:33:29
.
├── .git
│   ├── COMMIT_EDITMSG
│   ├── HEAD
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-commit.sample
│   │   ├── pre-push.sample
│   │   ├── pre-rebase.sample
│   │   ├── pre-receive.sample
│   │   ├── prepare-commit-msg.sample
│   │   └── update.sample
│   ├── index
│   ├── info
│   │   └── exclude
│   ├── logs
│   │   ├── HEAD
│   │   └── refs
│   │       └── heads
│   │           └── master
│   ├── objects
│   │   ├── 53
│   │   │   └── 8dd7fed7a1afcdd63117550cfb4edae61dd579
│   │   ├── d8
│   │   │   └── b9eacedc71403b061cacff5eaa3955515392c5
│   │   ├── e6
│   │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   │   ├── info
│   │   └── pack
│   └── refs
│       ├── heads
│       │   └── master
│       └── tags
└── gittest1.txt

15 directories, 23 files
```
git commit したらディレクトリとファイルが新たに増えました。

git logで確認してみましょう。

```
% git log                                                                                                             (git)-[master] 12:41:12
commit 538dd7fed7a1afcdd63117550cfb4edae61dd579
Author: xxx xxxx <example@gmail.com>
Date:   Mon May 8 12:33:28 2017 +0900

    first commit

```

commit の 538dd7fed7a1afcdd63117550cfb4edae61dd579 ですが、
よく見てみると、objectの配下にあるファイル名と同じですね。
ここまで書いて力尽きました…。
詳しくは以下のサイトを参照して下さい。

Gitのリポジトリの中身をなるべく正確に理解する
https://www.kaitoy.xyz/2015/12/27/git-repository/