.gitignoreについて(dotinstall git入門で詰まったのでちょっと調べてみた)

##.gitignoreとは
`.gitignore`ファイルを作成し、ファイルやディレクトリを指定することでgitの管理から外すことができる。`.log`ファイルなど、管理する必要はないけどファイルサイズが大きいものとかに適用させる。


##詰まったところ
dotinstallのgit入門「#09_git管理に含めない設定」において、作業ディレクトリに

```:作業ディレクトリ
index.html
error.log
```
がある状態で`.gitignore`を作成し、`git status`で確認すると、`.log`ファイルが消えて`.gitlgnore`ファイルしか`git`が管理対象として識別していませんねと説明。

動画通りだと

```bash
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	.gitignore
nothing added to commit but untracked files present (use "git add" to track)
```

となる予定だったけど、実際自分が行ってみると

```bash
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   error.log
#	modified:   style.css
#
no changes added to commit (use "git add" and/or "git commit -a")
```
おい、認識されてるじゃねーか・・・
どういうこっちゃとなった訳ですよ。
(ちなみにstyle.cssはなんとなく作ったので無視しておけ)

##現状を整理
まず動画で行なっている手順を簡単にまとめてみると
1. 今まで編集していた`index.html`とは別に、新たに`error.log`を作成(`vi`コマンドで)
2. `git status`で確認すると(動画内では確認してないけど)新たに作成された`error.log`がまだステージングエリア(インデックス)に`add`されてないよと表記される(予定)。
3. そこで`.gitignore`を作成し、拡張子`.log`のファイルはすべて無視するように

```:.gitignore
*.log
```
と編集し、保存(`i`で挿入モード - `*.log`と入力 - escキー　-　`:wq`で上書き保存)。

4.`git status`で確認すると、先ほど作成した`error.log`が表示されなくなり、代わりに`.gitignore`のみ表示されるようになりましたね。
-> つまり`git`が`.error.log`を管理対象から外していることがわかりますねという感じ

##原因
上で表記した通り、動画内では、新たに作成したファイル(addもcommitもしてない)に対して`.gitignore`を作成して`git status`を確認すると`.log`のファイルが表示されなくなったよと説明していた。

それに対して自分の場合、「#08_gitでのファイル操作について」のレッスンにおいて、**今いるディレクトリより下の階層にある作成・編集したすべてのファイルをステージングエリア(インデックス)にあげる**`git add .`の動きを確認するため、今まで`index.html`しか扱っていなかったが、新たに`style.css`と`error.log`を作成し、`git add .`を確認してそのまま次のレッスンに進んでしまっていた。
-> つまり勝手なことをしたことによる自爆ですね。

dotinstallの動画では`git add .`による動きを口頭のみで説明したので、動画通りに進めていたらディレクトリ内には`index.html`しかないため、本レッスンで`error.log`を作成した状態で進めていれば動画通りに動くよということでした。 

そう考えると、自分の出てきた画面を見てみると

```bash
#	modified:   error.log
#	modified:   style.css
```
思いっきり`modified`(修正されましたよ)と書かれてましたね。
リポジトリに`commit`済みであることを証明しています・・・
動画通りに進めていたら、`error.log`を作成後に`git status`を入れると

```bash
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	error.log
#	style.css
```
こんな感じになったのかなと思います。


##疑問
でもそうなると、`add`も`commit`もしていないファイルにしか`.gitignore`って適用できないの？と思ったので、自分のような状況でも`.gitignore`を適用させる方法がないかちょっと調べてみました。(てかできなったらほとんど意味ないけど)

##解決策
`.gitignore`には大きな特徴があるみたいで、**設置した際にすでにリポジトリに登録してあるファイルに対しては記述しただけではgitの管理から外すことができない**みたいです。その場合、一度リポジトリから無視したいファイルを管理対象から外すという処理が必要ということ。
以下のコマンドでリポジトリから対象ファイルを管理対象から外すことが可能です。

```bash:
$ git rm --cached 対象のファイル(今回だとerror.log)
```
ここで1つ注意点として、`--cached`は**絶対につけるようにしてください！**
`--cached`をつけないとリポジトリからファイルを丸ごと削除してしまいます！
`--cached`をつけることで、リポジトリからファイルを削除せず、管理対象から外すだけとなるのでご注意を！

つまり今回の状況だと
1.リポジトリから管理対象を外すために`git rm --cached error.log`を実行
2.`git status`で`error.log`が管理対象から外れているかチェック
-> `deleted: error.log`となっていれば管理対象から外れている
3.`git commit`で管理対象から外したという変更をリポジトリに適用させる
4.`git status`で変更が適用されていることを確認
-> `deleted: error.log`が消えていればおけ
5.`.gitignore`を作成
6.`.git status`で確認すると、`.log`ファイルが表示されずに`.gitignore`のみが表示されることがわかる。
7.`git`の管理下にあるファイルにも適用させるために、`.gitignore`を`add`、`commit`させることでgit管理下ファイルにも適用させることが可能となる
-> ここは主に複数人での作業で全員に適用させたい場合などに用いる

もちろん`.log`のみではなくて、複数のファイルを同時に登録しておき、管理外にさせることも可能なので、その場合に応じて適応させると良いと思います。


##最後に
`.gitignore`を調べている間にいくつかの便利な情報を知ることができたので、忘れないうちに記載しておきます。

```bash:
$ git ls-files
```
-> 現在gitが管理しているファイルおよびディレクトリを一覧で表示してくれる

```bash:
$ git log
```
-> gitにコミットさせた履歴を一覧として表示(基本中の基本ですが、忘れてた)

```bash:
$ git log --stat
```
-> gitにコミットした履歴と、ファイルの変更箇所も同時に表示


##参考文献
先人様の知恵に感謝です。むしろこちらの方がより詳しく記載されています。
- http://sutara79.hatenablog.com/entry/2015/07/21/115842 (.gitignoreについて)
- http://qiita.com/yuuAn/items/b1d1df2e810fd6b92574 (.gitignoreについて)
- http://qiita.com/megu_ma/items/a438a71c84145f14d04e (git rm --cached)