コミット履歴の閲覧 "git log"

# 記事の目的
+ **git log** コマンドについて記載
:::note info
+ [Pro Git](https://git-scm.com/book/ja/v2)を基に記事を作成しました。
+ 後ほど記事の改修しやすいように[元の記事](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)から分離しました。
:::

# 本文
### 1.概要
+ 過去に何が起こったのか振り返りたくなる時に使う
+ ここからの例では、 "simplegit" というプロジェクトを使用する。
+ デフォルト＆引数なしで **git log** を使用した場合
```
このようにして取得する。
$ git clone https://github.com/schacon/simplegit-progit
```
**git log** を実行すると...
```
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit
```
・デフォルトで引数を何も指定しなければ、 **git log** はそのリポジトリでのコミットを新しい順に表示します。
・表示するもの：「SHA-1チェックサム」「作者の名前とメールアドレス」「コミット日時」「コミットメッセージ」

+ オプション **-p　-2**を使用した場合
・**-p** は、各コミットで反映された変更点を表示します。
・**-2** は、直近に２エントリだけを出力します。
・このオプションは、先ほどと同じ情報を表示するとともに、各エントリの直後にそのdiffを表示します。
・コードレビューの時に非常に便利。他のメンバーが一連のコミットで何をおこなったのかをざっと眺めるのにも便利。
```
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end
\ No newline at end of file
```

+ オプション **--stat** を使った場合
・各コミットに関するちょっとした統計情報を見たい,「まとめ」系のオプション
・各コミットエントリに続けて変更されたファイルの一覧と変更されたファイルの数、追加・削除された行数が表示されます。また、それらの情報のまとめを最後に出力します。
```
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

README           |  6 ++++++
Rakefile         | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
```

+ オプション **--pretty** を使用した場合
・ログをデフォルトの書式以外で出力する。
・**oneline** オプションは、各コミットを一行で表示する。（大量のコミットを見るのに便利）
・他には **short** 、 **full** 、 **fuller** といったオプションもある。標準とほぼ同じ書式だけれども情報量がそれぞれ少なめあるいは多めになる。
・**oneline** オプションを使用した場合
```
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
```
・**format** を使用した場合
独自のログ出力フォーマットを指定することができる。
```
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
```

### 2."git log --pretty=format"用の便利なオプション
| オプション| 出力される内容 |
|:-:|:-:|
|%H|コミットのハッシュ|
|%h|コミットのハッシュ (短縮版)|
|%T|ツリーのハッシュ|
|%t|ツリーのハッシュ (短縮版)|
|%P|親のハッシュ|
|%p|親のハッシュ (短縮版)|
|%an|Author の名前|
|%ae|Author のメールアドレス|
|%ad|Author の日付 (--date= オプションに従った形式)|
|%ar|Author の相対日付|
|%cn|Committer の名前|
|%ce|Committer のメールアドレス|
|%cd|Committer の日付|
|%cr|Committer の相対日付|
|%s|件名|

author: その作業をもともとおこなった人
commiter: その作業を適用した人
・さらに **--graph** を組み合わせると便利
```
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local
```

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

### 4.ログ出力の制限 "--since" "--until"
| オプション | 説明 |
|:-:|:-:|
|-(n)|直近の n 件のコミットのみを表示する|
|--since, --after |指定した日付より後に作成されたコミットのみに制限する|
|--until, --before |指定した日付より前に作成されたコミットのみに制限する|
|--author|エントリが指定した文字列にマッチするコミットのみを表示する|
|--committer|エントリが指定した文字列にマッチするコミットのみを表示する|
|--grep|指定した文字列がコミットメッセージに含まれているコミットのみを表示する|
|-S|指定した文字列をコードに追加・削除したコミットのみを表示する|
```
簡単な例
$ git log --since=2.weeks
他にも特定の日を指定したり、相対日付を"2 years 1 day 3 minutes ago"のように指定することもできる。
詳細な例は、Pro Gitを読んでください
```


# 参考文献
+ [Pro Git ver.日本語訳](https://git-scm.com/book/ja/v2)

# Gitについてのリンク
+ [Gitを理解するためにProGitを読んでみた。](https://qiita.com/yuyas7/items/cafc6ff737b20e33e4d0)