1. ホーム
  2. Git

【Git】git log のオプションまとめ|–oneline・–graph・-S で履歴を絞り込む方法

Share

コミットの履歴を確かめようとして git log を打ったものの、ハッシュと名前と日付が延々と流れてきて、結局読むのをやめてしまった。そんな経験はないでしょうか。git log は既定の表示が丁寧すぎるため、素のまま使うと情報量が多く、目的のコミットにたどり着けません。この記事では、表示を整えるオプションと、条件でコミットを絞り込むオプションを整理し、「いつ・誰が・どのファイルの・どの文字列を変えたのか」を素早く探せるようにしていきます。

素の git log が読みにくい理由

まずは何も付けずに実行したときの出力を見てみます。

ターミナル
$ git log
commit 9f3c1d2b6e4a07f35c8d1a92b47e0c6f8d3a5b21 (HEAD -> main, origin/main)
Author: Taro Yamada <taro@example.com>
Date:   Mon Sep 21 18:42:10 2026 +0900

    READMEに導入手順を追記

commit 2d51f0c8a3b47e91d05c6f28a7b3e40d9c15a862
Author: Hanako Suzuki <hanako@example.com>
Date:   Sun Sep 20 11:07:33 2026 +0900

    検索結果のページングを実装

1コミットにつき6行も使っており、40桁のハッシュやメールアドレスまで表示されます。正確ではあるのですが、「最近どんな作業をしたか」をざっと眺めたいだけのときには過剰です。git log はオプションを付けて初めて実用的になるコマンドだと考えて、目的に応じて表示を削ったり条件を足したりしていきましょう。

表示を整えるオプション

–oneline で1コミット1行にする

もっとも使用頻度が高いのが --oneline です。ハッシュを短縮形にし、コミットメッセージの1行目(サブジェクト)だけを並べてくれます。

ターミナル
$ git log --oneline
9f3c1d2 (HEAD -> main, origin/main) READMEに導入手順を追記
2d51f0c 検索結果のページングを実装
a4c9b13 検索フォームのマークアップを追加
e07d5a9 トップページの見出しを修正
5c1b8f4 初期コミット

同じ履歴が一気に見通しよくなりました。行頭の短いハッシュは、そのまま git show 2d51f0c や git revert 2d51f0c のように他のコマンドへ渡せます。

–graph –all でブランチの分岐を見る

--graph を付けると、コミットのつながりが左側のアスキーアートで描かれます。さらに --all を足すと、今いるブランチだけでなくリポジトリ内のすべてのブランチが対象になり、どこで枝分かれしてどこで合流したのかが一目で分かります。この組み合わせが git log の定番です。

ターミナル
$ git log --oneline --graph --all
* 9f3c1d2 (HEAD -> main, origin/main) READMEに導入手順を追記
*   6b7a4e8 Merge branch 'feature/search'
|\  
| * 2d51f0c (feature/search) 検索結果のページングを実装
| * a4c9b13 検索フォームのマークアップを追加
|/  
* e07d5a9 トップページの見出しを修正
* 5c1b8f4 初期コミット

|\ の行が分岐、|/ の行が合流を表しています。feature/search が e07d5a9 から分かれ、2つのコミットを重ねたあと 6b7a4e8 でマージされた、という流れが図として読み取れます。

行末の (HEAD -> main, origin/main) はブランチ名やタグを示す装飾で、--decorate の働きによるものです。現在の Git ではこの設定の既定値が auto になっており、画面に直接出力するときは自動で付きます。パイプやファイルへ流したときにも表示したい場合に、明示的に --decorate を指定します。

表示量を調整するオプション

件数を絞りたいときは -n 5(または -5)、変更されたファイルの一覧が見たいときは --stat、実際の差分まで確認したいときは -p を使います。よく使うものを整理しておきます。

オプション効果
--oneline短縮ハッシュとメッセージ1行目だけを表示する
--graphコミットのつながりを罫線の図で表示する
--allすべてのブランチ・タグを対象にする
--decorateブランチ名やタグ名を併記する(既定は auto)
-n <数>表示するコミットを指定件数までにする
--stat変更ファイルと増減行数の要約を表示する
-pコミットごとの差分(パッチ)を表示する
--reverse古いコミットから順に並べる

--stat を付けると、そのコミットがどのファイルをどれくらい触ったのかが分かります。

ターミナル
$ git log --stat -n 1
commit 2d51f0c8a3b47e91d05c6f28a7b3e40d9c15a862
Author: Hanako Suzuki <hanako@example.com>
Date:   Sun Sep 20 11:07:33 2026 +0900

    検索結果のページングを実装

 src/search.js       | 32 ++++++++++++++++++++++++++++----
 templates/list.html |  8 ++++++++
 2 files changed, 36 insertions(+), 4 deletions(-)

さらに踏み込んで中身を見たいときが -p です。git show を履歴の分だけ連続して実行したような表示になるので、-n や後述の絞り込みと組み合わせて範囲を狭めてから使うのがコツです。

ターミナル
$ git log -p -n 1 templates/search.html
commit a4c9b13d7f0e2a58c93b1d4e60a7f82c5b3d9e10
Author: Hanako Suzuki <hanako@example.com>
Date:   Sat Sep 19 16:20:05 2026 +0900

    検索フォームのマークアップを追加

diff --git a/templates/search.html b/templates/search.html
index 3f2a1c8..9d4e7b2 100644
--- a/templates/search.html
+++ b/templates/search.html
@@ -10,6 +10,9 @@
   <div class="content">
+    <form action="/search" method="get">
+      <input type="search" name="q">
+    </form>
   </div>

条件でコミットを絞り込む

表示が整ったら、次は対象そのものを減らします。git log は条件を複数並べると、すべてを満たすコミットだけが残ります。

–author で書いた人を絞る

--author には名前でもメールアドレスでも指定でき、部分一致で照合されます。--author="suzuki" のように一部だけ書けば十分です。

ターミナル
$ git log --oneline --author="Hanako"
2d51f0c 検索結果のページングを実装
a4c9b13 検索フォームのマークアップを追加

–since / –until で期間を絞る

期間の指定には --since(それ以降)と --until(それ以前)を使います。--after は --since の、--before は --until の別名で、どちらを書いても動作は同じです。日付は 2026-09-01 のような書き方のほか、"2 weeks ago" や yesterday といった相対表現も受け付けます。

ターミナル
# 9月に入ってからのコミットだけを見る
git log --oneline --since="2026-09-01"

# 直近2週間のコミットを、自分のぶんだけ
git log --oneline --since="2 weeks ago" --author="Taro"

# 期間を区切る
git log --oneline --since="2026-09-01" --until="2026-09-15"

–grep でコミットメッセージを検索する

「たしかバグ修正のコミットがあったはず」というときは --grep です。コミットメッセージを正規表現で検索します。英語の大文字小文字を無視したいときは -i を添えます。

ターミナル
$ git log --oneline --grep="修正"
e07d5a9 トップページの見出しを修正
b1f8c05 リンク切れを修正

--grep を2つ以上並べた場合は、どれかに一致すれば表示される「いずれか」の条件になります。すべてに一致させたいときは --all-match を付けてください。

ファイル単位で履歴を追う

特定のファイルに関わるコミットだけを見たいときは、コマンドの最後にパスを書きます。このとき、オプションやブランチ名とパスの区切りとして -- を挟むのが安全です。

ターミナル
# 1つのファイルの履歴
git log --oneline -- src/search.js

# ディレクトリ全体の履歴
git log --oneline -- templates/

-S で「その文字列を触ったコミット」を探す

git log のオプションの中でもとくに便利なのが -S <文字列> です。pickaxe(つるはし)と呼ばれる機能で、差分の中でその文字列の出現回数が変化したコミット、つまりその文字列を追加または削除したコミットだけを抜き出します。「この定数はいつ導入されて、いつ消えたのか」を追跡するのに向いています。

ターミナル
$ git log --oneline -S "API_ENDPOINT"
c7e2f91 APIのURLを環境変数から読むように変更
3a8d604 API呼び出し処理を追加

上の結果は、3a8d604 でこの文字列が書かれ、c7e2f91 で書き換えられたことを示しています。あとは git show c7e2f91 で中身を確認すれば、変更の経緯までたどれます。

似たオプションに -G <正規表現> があります。こちらは出現回数ではなく、差分の行そのものに正規表現が一致するかで判定します。行の移動や書式変更のように出現回数が変わらない編集も拾いたい場合や、パターンで探したい場合は -G が適しています。なお -S と -G は履歴全体の差分を計算するため、大きなリポジトリでは結果が返るまで少し時間がかかります。パス指定と併用すると速くなります。

オプション絞り込みの基準
--author=<名前>作者の名前・メールアドレスの部分一致
--since=<日付>指定日時より新しいコミット(--after も同じ)
--until=<日付>指定日時より古いコミット(--before も同じ)
--grep=<文字列>コミットメッセージへの一致
-- <パス>そのファイル・ディレクトリを変更したコミット
-S <文字列>その文字列の出現回数が変わったコミット
-G <正規表現>差分の行が正規表現に一致するコミット
--merges / --no-mergesマージコミットだけ/マージコミット以外

マージコミットと、ブランチ間の差分を見る

チームで開発していると、履歴が「Merge branch …」だらけになることがあります。実際の作業内容だけを追いたいときは --no-merges でマージコミットを除外します。逆にリリースの区切りを確認したいときは --merges でマージだけを並べると読みやすくなります。

そして覚えておきたいのが A..B という範囲指定です。これは「B からたどれるが A からはたどれないコミット」、平たく言えば B にはあって A にはないコミットを意味します。プルリクエストを出す前に、自分のブランチが何を追加しているのかを確認するのに使えます。

ターミナル
$ git log --oneline main..feature/search
2d51f0c 検索結果のページングを実装
a4c9b13 検索フォームのマークアップを追加

順序を入れ替えて git log --oneline feature/search..main とすると、今度は「main にはあって feature/search にはないコミット」、つまり取り込みそびれている変更が分かります。リモートとの比較も同じ書き方で、git log --oneline origin/main..main と打てば、まだ push していないコミットの一覧になります。

–pretty=format: で表示を自分好みにする

--oneline では物足りない、日付と作者も1行に入れたい、というときは --pretty=format: で表示を自作できます。% で始まるプレースホルダーを並べ、それ以外の文字はそのまま出力されます。

ターミナル
$ git log --pretty=format:"%h %ad %an %s" --date=short -n 3
9f3c1d2 2026-09-21 Taro Yamada READMEに導入手順を追記
2d51f0c 2026-09-20 Hanako Suzuki 検索結果のページングを実装
a4c9b13 2026-09-19 Hanako Suzuki 検索フォームのマークアップを追加

日付の形式は --date で変えられます。--date=short なら 2026-09-21、--date=relative なら「2 days ago」、--date=iso なら秒とタイムゾーンまで含んだ表記になります。よく使うプレースホルダーは次のとおりです。

プレースホルダー意味
%Hコミットハッシュ(40桁)
%h短縮したコミットハッシュ
%an作者(author)の名前
%ae作者のメールアドレス
%ad作者の日付(--date の指定に従う)
%ar作者の日付を相対表記で
%cnコミッター(committer)の名前
%sコミットメッセージの1行目
%bコミットメッセージの本文
%dブランチ名・タグ名などの装飾
%n改行

作者(author)はその変更を書いた人、コミッター(committer)は実際にコミットを作った人です。ふだんは同じ人物ですが、rebase や cherry-pick を行うと別々になるため、両方のプレースホルダーが用意されています。色を付けたい場合は %C(yellow)%h%Creset のように %C(...) で囲みます。

よく使う形はエイリアスにしておく

毎回 --oneline --graph --all --decorate と打つのは大変なので、Git のエイリアス機能に登録してしまいましょう。git config に alias.<名前> の形で登録すると、独自のサブコマンドとして使えるようになります。

ターミナル
# 定番の組み合わせを git lg で呼び出せるようにする
git config --global alias.lg "log --oneline --graph --all --decorate"

# 日付と作者入りの一覧を git ll で
git config --global alias.ll "log --pretty=format:'%h %ad %an %s' --date=short"

登録したあとは git lg と打つだけで同じ結果が得られます。--global を付けているので、そのマシンのどのリポジトリでも使えます。設定は ~/.gitconfig の [alias] セクションに書き込まれるので、直接編集しても構いません。エイリアスにさらにオプションを足すこともでき、git lg -n 10 のように後ろに書いたものも有効です。

git log が思ったとおりに動かないとき

ファイル名を指定したのにエラーになる

git log search のようにパスだけを書いたとき、ambiguous argument 'search': unknown revision or path not in the working tree. というエラーが出ることがあります。これは Git が「search」をブランチ名として解釈しようとして失敗したためです。Git はコマンドの引数を「コミットの指定」と「パスの指定」の両方として受け取るので、名前が紛らわしいと判断できません。

解決策は、パスの前に -- を置いて「ここから先はファイル名です」と明示することです。git log -- search と書けば確実に動きます。すでに削除したファイルの履歴を見るときも、そのパスは作業ツリーに存在しないため、-- が必須になります。

–since を指定しても件数が変わらない

日付の書き方が解釈されていない可能性があります。--since=2026/09/01 のようなスラッシュ区切りや、"9月1日" のような日本語表記は正しく読み取れません。2026-09-01 というハイフン区切り、あるいは "3 days ago" "last monday" といった英語の相対表現を使ってください。空白を含む指定は、シェルに分割されないようクォートで囲むのを忘れないようにします。

もうひとつ注意したいのは、--since が見ているのがコミットの日付であって、履歴上の並び順ではない点です。rebase や cherry-pick を行ったコミットは日付と並び順が食い違うことがあり、期待した範囲から外れて見えることがあります。

画面が止まって操作できなくなる

git log の出力は、画面に収まらない長さになると less というページャーに渡されます。プロンプトが戻ってこないように見えるのはこのためで、フリーズしているわけではありません。終了するには q を押します。上下の移動は矢印キーや j / k、1画面送りはスペースキー、文字列の検索は / に続けて語句を入力します。

ページャーを通さず、結果をそのまま流したいときは --no-pager を使います。

ターミナル
# このコマンドだけページャーを使わない
git --no-pager log --oneline -n 10

ファイルの履歴が途中で途切れる

「このファイルはもっと前から編集していたはずなのに、数件しか出てこない」という場合、途中でファイル名を変えたりディレクトリを移動したりしていないか確認してください。git log -- <パス> は今の名前のファイルだけを追うため、改名より前の履歴は表示されません。

そこで使うのが --follow です。改名を検出して、その前の名前だったころの履歴まで続けてたどってくれます。

ターミナル
$ git log --oneline --follow -- src/search.js
2d51f0c 検索結果のページングを実装
a4c9b13 検索フォームのマークアップを追加
7e4b209 search.js に処理を切り出す
1c93da5 検索処理の下書きを追加

--follow は1つのファイルにだけ使えるオプションで、ディレクトリや複数パスの指定には対応していません。複数ファイルをまとめて追いたいときは、ファイルごとに実行することになります。

まとめ

git log は、表示を整えるオプションと対象を絞り込むオプションを組み合わせて使うコマンドです。まずは git log --oneline --graph --all を身体で覚えてしまえば、履歴の全体像はほぼ把握できます。そのうえで、誰が書いたかなら --author、いつの変更かなら --since と --until、コミットメッセージからなら --grep、ファイル単位なら末尾に -- とパス、そしてコードの中身から探すなら -S や -G というように、手がかりの種類で使い分けます。ブランチ間の差分は main..feature の形で、表示の書式は --pretty=format: と --date で自由に組み立てられます。よく打つ組み合わせが決まってきたら git config --global alias.lg でエイリアスに登録しておくと、履歴を確認するハードルがぐっと下がります。うまく結果が出ないときは、パスの前の --、日付の書き方、そしてページャーを抜ける q を思い出してください。

参考ページ