git logの読み方・オプション次第で履歴は宝の地図になる

前記事のreflogが「HEADがどう動いたか」を追う仕組みだったのに対し、git logは「コミットとして何を変更してきたか」を追うコマンドです。どちらも過去を振り返る点は同じですが、git logはオプションを知っているかどうかで、読み取れる情報量がまったく変わってきます。

デフォルトの長い出力は、新聞の全文記事をずっと読み続けているようなもの

git logはオプション無しで実行するコマンドで、出てきた結果をそのままスクロールして読むものだと思うかもしれません。ですが素のgit logは1コミットごとにハッシュ・著者・日時・メッセージを何行もかけて表示するため、履歴全体をざっと俯瞰したい場面には向いていません。--onelineと--graphを組み合わせるだけで、見え方が劇的に変わります。

# 素の出力(1コミットあたり4〜5行、ハッシュ全体も表示される)
git log

# 1コミット1行にまとめ、ブランチの分岐・合流を線で可視化する
git log --oneline --graph --all --decorate
# * a1b2c3d (HEAD -> feature) 途中まで書いたAPI連携
# * 9f8e7d6 UIの初期実装
# | * 734713b (main) 緊急修正: nullチェック追加
# |/
# * 6ebd0e2 プロジェクト初期化
🎯 読み解きポイント:新聞の全文記事を読むか、見出し一覧を眺めるか

新聞に例えると、素のgit logは「1面から最終面まで、記事本文を全部読み通す」ようなものです。--onelineは「見出しだけをずらっと並べた一覧」、--graphはさらに「どの見出しがどの特集記事の続報なのか、線で示した紙面レイアウト」に相当します。全体像をつかみたいときは見出し一覧とレイアウトから入り、気になった記事だけ本文(git showやコミット単体のdiff)を読みに行く、という順番が効率的です。

「誰が・いつ」ではなく「何を変更したか」で絞り込むpickaxe検索

過去の変更を探すとき、手がかりになるのは著者名や日付だけだと思うかもしれません。ですがgit logには、コードの中身そのものを検索対象にする「pickaxe検索」というオプションがあり、特定の文字列や関数名がいつ追加・削除されたかを直接特定できます。

# "calcTotalPrice"という文字列が追加/削除されたコミットを探す(単純な文字列一致)
git log -S"calcTotalPrice" --oneline

# 正規表現で、特定パターンにマッチする行が変更されたコミットを探す
git log -G"function\s+calcTotal" --oneline

-Sは「その文字列の出現回数が変化したコミット」を、-Gは「正規表現にマッチする行に変更があったコミット」を拾う仕組みで、単純な文字列一致か正規表現かという違いがあります。「このバグの原因になった関数はいつ書かれたのか」「この設定値はいつから今の値になったのか」を調べたいとき、コミットメッセージを1つずつ読むより、pickaxe検索で直接特定した方が確実です。

🎯 読み解きポイント:書類の作成者名ではなく、書類に書かれた特定の単語で全文検索する

社内文書の検索に例えると、--authorによる絞り込みは「作成者名で検索する」ことに相当します。一方pickaxe検索は「文書に書かれている特定の単語そのもので全文検索する」ことに相当します。「誰が作ったか」は分からなくても「その一文がいつ書き加えられたか」さえ分かれば十分、という場面では、作成者を辿るより本文検索の方が近道です。

よくあるはまりポイント:同じ人のはずなのに--authorで見つからない

--authorオプションで自分や特定の同僚のコミットを絞り込めば、その人の変更を漏れなく追えるはずだと思うかもしれません。ですが実際には、同じ人物であっても、会社PCと自宅PCでgit config user.nameの設定が微妙に違っていたり(「山田太郎」と「Taro Yamada」など)、コミットのたびに表記が揺れていたりすると、単純な--author="山田太郎"という指定では一部のコミットが検索から漏れてしまいます。心当たりのある表記がいくつかある場合は、正規表現に対応した--authorの性質を利用して--author="山田太郎\|Taro Yamada"のようにOR条件で指定するか、いっそメールアドレスのドメイン部分だけで絞り込むなど、表記ゆれを前提にした探し方をする必要があります。

この記事のキーワード
git log --oneline / --graph
--onelineは1コミット1行に要約、--graphはブランチの分岐・合流を線で可視化する。組み合わせて履歴全体を俯瞰するのに使う
pickaxe検索(-S / -G)
コミットメッセージではなく変更内容(コードの中身)を検索対象にするオプション。-Sは文字列の増減、-Gは正規表現マッチの変化を検出する
--author
正規表現に対応した作者名の絞り込みオプション。表記ゆれがある場合はOR条件で複数パターンを指定して対応する
💡 ワンポイントアドバイス:まず俯瞰、それから絞り込みの2段構え

git log --oneline --graph --all --decorateで全体の流れを掴んでから、気になる箇所だけ-Sや--authorで絞り込む、という2段構えで探すと、闇雲にコミットメッセージを読み漁るより早く目的のコミットにたどり着けます。

コミットの探し方が分かったところで、次は見つけたコミットのメッセージ自体をどう書くべきか、続くコミットメッセージの書き方で見ていきます。