git logのオプションと綺麗にツリー表示するためのエイリアス

# 要旨
まず、`git log`コマンドの細かなオプションを説明します。
最終的に、以下のようなコミットツリーの表示するためのオプションの指定方法を例示します。

<img width="1440" alt="スクリーンショット 2019-02-11 2.25.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/b5465a7e-45c4-6c64-4427-d24000954856.png"> 
# `git log`とは
gitで管理しているリポジトリがあるディレクトリで`git log`を叩くと過去のコミット履歴が表示されます。

```
$ git log
```
<img width="1308" alt="スクリーンショット 2019-02-11 2.19.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/4ac6330d-9e6e-4f82-8de9-dff4fb1e5aaa.png">


デフォルトだとリポジトリのコミットを新しい順に表示します。
表示される情報は

- SHA-1チェックサム(ハッシュ)
- 名前
- メールアドレス
- 日時
- コミットメッセージ

です。
## オプション
`git log`の後ろにオプションをつけることで表示を変えられます。

主なオプションは以下の表の通り

| オプション|説明 |
|:----------------:|:------------------|
| -p|各コミットのdiffを表示する|
| --word-diff|単語単位でdiffを表示する|
| --stat|各コミットで変更されたファイルの統計情報を表示する|
|--shortstat|--stat コマンドのうち、変更/追加/削除 の行だけを表示する|
| --name-only|コミット情報の後に変更されたファイルの一覧を表示する|
| --name-status|変更されたファイルと 追加/修正/削除 情報を表示する|
|--abbrev-commit|ハッシュの全体 (40文字) ではなく最初の数文字のみを表示す|
|--relative-date|完全な日付フォーマットではなく、相対フォーマット (“2 weeks ago” など) で日付を表示する|
|--pretty|コミットを別のフォーマットで表示する。オプションとして oneline, short, full, fuller そして format (独自フォーマットを設定する) を指定可能|
|--oneline|`--pretty=oneline --abbrev-commit`と同じ意味の便利なオプション|
|--graph|ブランチやマージの歴史を、ログ出力とともにアスキーグラフで表示する|

よく使うのが`--oneline` `--graph` `--pretty`です。
## `--oneline`

```
$ git log --oneline
```

`--oneline`を使うことでハッシュを短縮し、かつ各コミットを1行で表示させます。
デフォルトでは情報量が多すぎるのでスッキリ見やすくなります。
<img width="1110" alt="スクリーンショット 2019-02-11 2.19.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/771ae0bf-1f0e-d482-3de5-bf39bf76a0b1.png">

## `--graph`
```
$ git log --graph
```

`--graph`を使うことでブランチやマージが分かりやすいツリー形式で表示してくれます。
<img width="1273" alt="スクリーンショット 2019-02-11 2.20.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/fd17e952-f3ae-d907-354f-102c1d651866.png">

## `--pretty`
ログをデフォルトの書式以外で出力するためのオプションです。
出力をカスタマイズできるのでエイリアスを登録していつも使っています。

```
$ git log --pretty=oneline
```

このように`--pretty`に用意されたオプションや自分で作ったフォーマットを渡して使います。


コミットの情報量を以下のオプションを使って調整できます。

- `oneline` 
- `short` 
- `medium` 
- `full` 
- `fuller` 
- `email`
- `raw`

<img width="1398" alt="スクリーンショット 2019-02-11 2.22.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/a8e483b5-11c0-5dd2-6032-6e8d62e73117.png">
<img width="1339" alt="スクリーンショット 2019-02-11 2.22.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/a6b3491d-f771-e348-9064-cc24c38cdbbf.png">
<img width="1282" alt="スクリーンショット 2019-02-11 2.23.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/d103e530-186d-165d-61ac-10170e51b7ba.png">


また、便利なオプションに`format`があり

```
$ git log --pretty=format:"%h %s"
```

`"　"` の中に`%h`(短縮されたハッシュ)や`%s`(コミットメッセージ)などを入れることで表示させたい情報を好きな順番・色で表示することができます。また文字列を表示することもできます。

例えば

```
$ git log --pretty=format:"%h %CgreenHelloworld"
```

はこんな結果に。(`%Cgreen`で後ろの文字が緑色になります)
<img width="741" alt="スクリーンショット 2019-02-11 2.23.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/a61e5c53-dbb3-474e-4830-946d9b69bbd2.png">


```
$ git log --graph --pretty=format:"%h %ad %s"
```

はこんな結果に。(`%ad`は日時です)
<img width="1028" alt="スクリーンショット 2019-02-11 2.23.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/6225dc7f-7522-b0cd-fc38-74dae360a9ed.png">


`%h`のようなプレースホルダーは結構数があるので個人的に頻繁に使われるかなと思ったものだけを載せておきます。ドキュメントに全部載っているのでもっと知りたい人はご参照ください。(https://git-scm.com/docs/pretty-formats)

|プレースホルダー|説明|
|:---:|:---|
|%H|コミットのハッシュ|
|%h|コミットのハッシュ(短縮系)|
|%an|authorの名前|
|%ae|authorのメールアドレス|
|%ad|authorの日付(--date= オプションに従った形式)|
|%ar|authorの相対日付|
|%cn|committerの名前|
|%ce|committerのメールアドレス|
|%cd|committerの日付(--date= オプションに従った形式)|
|%cr|committerの相対日付|
|%s|コミットメッセージ|
|%d|ブランチやタグの名前|
|%Cred|文字を赤くする|
|%Cgreen|文字を緑色にする|
|%Cblue|文字を青くする|
|%Creset|文字の色を戻す|
|%C(auto)|文字の色をgitが用意している色にする|
|%C( )|色、属性の指定|
色と属性に関しては

- 色
    - `normal`
    - `black`
    - `red`
    - `green`
    - `yellow`
    - `blue`
    - `magent`
    - `cyan`
    - `white`
    - `#ff0ab3`のような8bitカラー
- 属性
    - `bold`:太字
    - `dim`:減光
    - `ul`:アンダーライン
    - `blink`:点滅

皆さんも`--pretty`を使ってオリジナルのログを表示してみてはどうでしょうか。

ちなみに自分はこれをエイリアスに登録して使っています。

```
$ git log --graph --pretty=format:'%x09%C(auto) %h %Cgreen %ar %Creset%x09by"%C(cyan ul)%an%Creset" %x09%C(auto)%s %d'
```

<img width="1431" alt="スクリーンショット 2019-02-11 2.24.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/8f530536-e433-4c64-d6c6-62582ffaeb43.png">


# エイリアスに登録する
エイリアスに登録することでいちいち長いコマンドを入力しなくても簡単に綺麗なログを表示することができるようになります。

Gitのエイリアスの設定はシステム全体、ユーザー、リポジトリと3つの範囲があるのですが、今回はユーザーにしてどのリポジトリでも共通に使えるようにします。

エイリアスの設置は`~/.gitconfig`に記述します。

```
$ vim ~/.gitconfig
```

ファイルを開いて以下のように追記します。

```~/.gitconfig
[alias]
    tree = log --graph --pretty=format:'%x09%C(auto) %h %Cgreen %ar %Creset%x09by"%C(cyan ul)%an%Creset" %x09%C(auto)%s %d'

```

これで

```
$ git tree
```

と打つだけで綺麗なログが表示されるようになります。
<img width="1440" alt="スクリーンショット 2019-02-11 2.25.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/235997/b5465a7e-45c4-6c64-4427-d24000954856.png">