"git log" で今日行った作業を表示&ファイル出力するときの注意

<!--link refs-->
[link_git_log_format_1]: http://qiita.com/harukasan/items/9149542584385e8dea75
[link_git_log_format_2]: http://qiita.com/qurage/items/daa67763e5a0090af06a
[link_echo_color]: http://www.m-bsys.com/linux/echo-color-1
<!--        -->

`git log`でその日に行ったcommitの一覧をターミナルに表示と、
markdownに出力したくなったので、そのメモとか解説とか注意点とか。

## 今日行った作業を表示する
<br>
![スクリーンショット 2015-12-07 11.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/27802/980a8b01-ab49-53f8-c5de-96b8e72bdb05.png)

こんな感じで、今日行った作業が一覧となって表示されます。
### 使い方
以下のエイリアスを、.gitconfigに追加する。

```bash
[alias]
        today = "!f () {\
                     git log --oneline --reverse --branches \
                     --since=midnight --date=iso \
                     --author=\"$(git config user.name)\" \
                     --format=\" - %C(auto)%h%Creset : %s %C(green)(%ad)%Creset\";\
                 };f"
```

`git today`と打てば実行されます。

```bash:Terminal
$ git today
## 出力結果
 - d9bed14 : first commit (2015-12-07 11:29:50 +0900)
 - 700eeed : second commit (2015-12-07 11:30:00 +0900)
 - 20ee988 : third commit (2015-12-07 11:30:06 +0900)
 - bc5d42d : forth commit (2015-12-07 12:04:56 +0900)
```

ワンライナーでも書けるとは思いますが、見やすさ重視の為に、`!f () { };f`を使用してます。
コピペでなく手入力で追加する際は、スペースの位置**( `()と{の間とか` )**に気をつけてください。

一部のoption、formatは好みがあると思うので、下記参考にしてカスタマイズしてもらえればと思います。
###オプション等の解説
- `--reverse`
指定する事で、取得したコミットログを逆順で出力することができます。
これによって、今日の作業を昇順で出力することができます。オプションをつけなければ通常どおり、最新のものから順に降順で出力されます。<br><br>

- `--branches`
指定することで、コミットログを出力する対象を全てのブランチにすることができます。
特定のブランチのみを指定することもできますし、指定しなければ、自分が今いるブランチに対してのコミットログのみを対象とすることができます。<br><br>

- `--since`
`--since=midnight`を指定することで、その日の0:00からのコミットログに絞ることができます。
`--since="1 day ago"`や、`--since="24 hours ago"`とかでも近いことは出来ますが、コマンドを実行した時刻からの相対になってしまうため、おすすめできません。<br><br>

- `--date`
指定することで、時刻の形式を変更することができます。後述の`--format`で表示する時刻の形式にも影響します。
`--date=iso`と指定すると、"YYYY-MM-DD HH:mm:ss"の形式にすることができます。(タイムゾーンも付加されてしまいますが...)
指定できるものは、「[git logのフォーマットを指定する][link_git_log_format_1] (のページ下部)」が参考になると思います。<br><br>

- `--author`
`--author="name"`と指定することで、コミットログのうち、指定したAuthorのものだけに絞ることができます。
自分のみのプロジェクトなら問題ないですが、複数人で作業しているプロジェクトだと、他の人が混ざってしまうこともあるので、自分の名前を指定します。
ただ、名前を直書きするのもあれなので、
`--author=\"$(git config user.name)\"`
と書いて、.gitconfigから取得するようにしています。プロジェクト毎にuser.nameを指定していればそれを、そうでなければ、globalの.gitconfigから取得する形になります。<br><br>

- `--format`
出力するときのフォーマットを指定します。指定しないと、デフォルトフォーマットが適応され、以下のようになります。

```bash
d9bed14 first commit
700eeed second commit
20ee988 (HEAD -> master) third commit
bc5d42d (develop) forth commit
```

自分の場合は、
`--format=\" - %C(auto)%h%Creset : %s %C(green)(%ad)%Creset\"`
と指定して、
` - コミット番号 : コミットメッセージ (時刻)`
となるようにしています。ついでに色付けも行っています。
先頭に` - `を付加しているので、markdownファイルに出力したときはそのままリスト形式になったりします。

>(余談:
><font color=red>時刻が含まれていると、自分で確認する分にはいいですが、
>これを後述の、ファイル出力して、誰かに提出するときとかはどの時間に何やったかわかってしまうので、
>除いたほうがいいかもしれないですね。笑</font>
>)

フォーマット、色付けに関しては以下が参考になると思います。

- [git logのフォーマットを指定する][link_git_log_format_1]
- [git log の表示とか色をがんばる][link_git_log_format_2]


## 今日行った作業をファイル(.txt等)に出力する

#### 上記todayエイリアスの`--format`に色指定を入れていない場合は...
<font color=red>エイリアス登録の際に、`--format`内に色の指定をしていなければ、以降の作業は不要です。
そのまま、
`git today > path/to/log.txt`
のようにして出力することができます。
</font>

----

ここまでで、ターミナルに表示することができるようになったので、いつでも`git today`と打てば、
今日自分これだけやったんだなーって確認することができます。
git todayの内容を、

```bash:Terminal
$ git today > log.txt
```
などとしてあげれば、テキストファイルに出力することができます。
ただ、1つだけ問題があって、<font color=red>`--format`内で色の変更を指定していると、正しい出力結果が得られない場合があります。</font>
試しに上記コマンドを実行して、log.txtを除いてみると...

```bash:Terminal
$ git today > log.txt
$ less log.txt
## 出力結果
 - [33md9bed14[m[m : first commit [32m(2015-12-07 11:29:50 +0900)[m
 - [33m700eeed[m[m : second commit [32m(2015-12-07 11:30:00 +0900)[m
 - [33m20ee988[m[m : third commit [32m(2015-12-07 11:30:06 +0900)[m
 - [33mbc5d42d[m[m : forth commit [32m(2015-12-07 12:04:56 +0900)[m
```

こんな感じで、`[m`などといった、"エスケープシーケンス"がついてしまいます。
ちなみに、`cat log.txt`とやるぶんにはこのようにはなりません。`less`で見たり、FinderからtxtファイルをEditorで開くとこうなるかと思います。

`cat`と`less`で違う結果になってしまう理由がわかってなくてすみません。。

寄り道になりますが、エスケープシーケンスについてはこちらを。(@riocampos さんより。)
参考：[シェル - echoで文字に色をつける その1][link_echo_color]

回避策としては、`--format`内で色の変更をしないようにするのが一番楽かと思います。
ただ、ターミナルで表示するときは色がついてて欲しい！って場合は、以下のようにエイリアスを別で用意して(あまりうまい方法とはいえないかもですが...)、
`git today-output > log.txt`とすればうまくいきます。

```bash
[alias]
        today-output = "!f () {\
                            git log --oneline --reverse --branches \
                            --since=midnight --date=iso \
                            --author=\"$(git config user.name)\" \
                            --format=\" - %h : %s \";\
                        };f"
```

*※`today`エイリアスから色を抜いて、時刻も抜いています。(上記余談参照。)*

```bash:Terminal
$ git today-output > log.txt
$ less log.txt
## 出力結果
 - d9bed14 : first commit
 - 700eeed : second commit
 - 20ee988 : third commit
 - bc5d42d : forth commit
```