git logで特定ディレクトリのコミット履歴を閲覧する

この記事は、[Git Advent Calendar 2018](https://qiita.com/advent-calendar/2018/git)の12日目の記事です。

先日Advent Calendarに[初めて参加](https://qiita.com/items/3cea66eb83280985d6cc)しましたが折角なのでもう1つ記事を書いてみます。
小ネタになります:pushpin:

# 前置き
Gitのリポジトリで特定ディレクトリのコミット履歴を確認することになりました。

# 結論
最初に結論を書きます。

```bash:構文
git log -- <path>…​
```
```bash:使用例
git log -- .         # カレントディレクトリ 
git log -- css       # 「css」ディレクトリ
git log -- css js    # 「css」「js」ディレクトリ
```
以降に調査した経緯や考察を書いていきます。
情報だけ知れればよい方は以降読み飛ばしてください:bangbang:
# 筆者が結論に辿り着くまでの経緯
筆者の要件は特定ディレクトリの`git log --oneline`を表示することです。

1. `git log -p <path>`  
ネット上では最も紹介されているように思いました。筆者の要件ではpオプションの情報(パッチ)が表示されているので情報が多すぎます。
1. `git log --oneline -p <path>`  
上記にonelineオプションを追加してみましたが、pオプションの情報(パッチ)は表示されたままで情報が多すぎます。
1. [ドキュメント](https://git-scm.com/docs/git-log)を読みパスを理解する  

    ```bash:構文
    git log [<options>] [<revision range>] [[--] <path>…​]
    ```
    pオプションの引数でパスが指定できるのではなく、`[[--] <path>…​]`でパスを指定する構文と理解しました。紹介されているコマンドは以下のように解釈されています。

    ```bash
    git log -p <path>…​
    # options       : p
    # revision range: 未指定
    # <path>        : "--"を省略して<path>を指定
    ```

1. pオプションを指定しない  
上記を理解できたのでpオプションを指定しないことにしました。
純粋に`git log`を指定パスでフィルタリングした結果になりました。
    ```bash
    git log <path>…​
    # options       : 未指定
    # revision range: 未指定
    # <path>        : "--"を省略して<path>を指定
    ```
1. onelineオプションと"--"を明示して&lt;path&gt;を指定

    ```bash
    git log --oneline -- <path>…​
    # options       : --oneline
    # revision range: 未指定
    # <path>        : "--"を明示して<path>を指定
    ```
"--"を明示する理由(日本語)は[こちら](https://ja.atlassian.com/git/tutorials/git-log)のページが分かりやすかったです。
> -- パラメーターは、後続の引数がブランチ名ではなく、ファイルパスであることを git log に伝えるために使用されます。ブランチと混同される可能性がまったくない場合は、-- を省略できます。

# 検証する
- サンプルの[リポジトリ](https://github.com/devnokiyo/example-git-log)  

    ```
    $ tree
    .
    ├── README.md
    ├── css
    │   ├── main.css
    │   └── style.css
    └── index.html
    ```
- 筆者の要件を満たしたコマンド

    ```bash
    $ git log --oneline css
    2985437 [main.css]新規作成
    18bd23a [style.css]「売切れ」スタイルを追加 [index.html]フライドポテトを追加 [index.html]ラーメンを売切れに変更
    1ea13c3 [index.html]ラーメンを追加 [style.css]「おすすめ」スタイルを追加
    c0cbb75 [style.css]新規作成
    ```
- ネットでよく紹介されるコマンド  

    ```bash
    $ git log -p css
    commit 298543770e8ccb83293edc7ea2861581aa67b2a6
    Author: devnokiyo <devnokiyo@gmail.com>
    Date:   Wed Dec 19 21:56:36 2018 +0900
    
        [main.css]新規作成
        
        メインで使うcssを事前に用意
    
        diff --git a/css/main.css b/css/main.css
    new file mode 100644
    index 0000000..e69de29
          :
          :
    commit c0cbb75a9224fcc411628b44dedd276bc6cb334e
    Author: devnokiyo <devnokiyo@gmail.com>
    Date:   Wed Dec 19 20:28:04 2018 +0900
    
        [style.css]新規作成
    
        h1タグの文字色は赤にする
    
        diff --git a/css/style.css b/css/style.css
    new file mode 100644
    index 0000000..4f1c9e7
    --- /dev/null
    +++ b/css/style.css
    @@ -0,0 +1,3 @@
    +h1 {
    +  color: #00F
    +}
    ```

# ファイルも指定可能
ディレクトリだけでなくファイルを指定することもできます。
むしろこちらの方がより多く紹介されていますね。

```bash
git log css/style.css
git log css/style.css css/main.css
```

# 参考
[公式ドキュメント](https://git-scm.com/docs/git-log)
[bitbucket](https://ja.atlassian.com/git/tutorials/git-log)

# 終わりに
紹介されているコマンドも単にコピペするのではなく、ドキュメントを読んで構文や仕様を理解して解釈すると勉強になりますね。重要なことなので調査する度に痛感します。