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条件で複数パターンを指定して対応する
git log --oneline --graph --all --decorateで全体の流れを掴んでから、気になる箇所だけ-Sや--authorで絞り込む、という2段構えで探すと、闇雲にコミットメッセージを読み漁るより早く目的のコミットにたどり着けます。
コミットの探し方が分かったところで、次は見つけたコミットのメッセージ自体をどう書くべきか、続くコミットメッセージの書き方で見ていきます。