Git入門:バージョン管理のきほん
履歴を読む(git log)
このレッスンで分かること
git logが何を表示していて、コミットがどうつながっているのか--onelineや--graphで履歴を読みやすい形に整える方法- 「いつ・誰が・どこを変えたか」を絞り込んで探す方法
git log は何を見せているのか
git add と git commit で記録を積み上げてきましたが、ここまでは「保存する側」の話でした。バージョン管理の本当の価値は、あとから「いつ、誰が、なぜこれを変えたのか」を取り出せることにあります。それを担当するのが git log です。
まずはそのまま実行してみます。
ターミナル
$ git logプレーンテキスト
commit 9f1c0a4c6b3b2a1e5d8f7c6b5a4938271605f4e3
Author: Hanako Sato <hanako@example.com>
Date: Mon Jul 6 14:22:10 2026 +0900
ログイン画面のバリデーションを追加
commit 3b7d21e8a95f0c4d1b6e2a7c8d9f0e1a2b3c4d5e
Author: Hanako Sato <hanako@example.com>
Date: Mon Jul 6 11:08:44 2026 +0900
トップページの見出しを修正新しいコミットが上、古いコミットが下です。時系列の逆順で並ぶ、と覚えてください。
1件ごとに 4 つの情報が出ています。
| 行 | 内容 |
|---|---|
commit 9f1c0a4... | コミットを一意に識別する 40 桁のハッシュ |
Author | 変更を書いた人の名前とメールアドレス |
Date | コミットが作られた日時 |
| 字下げされた行 | コミットメッセージ |
Author に出ている名前とメールは、git config user.name と git config user.email で設定した値がそのまま入っています。設定を間違えたまま作業していると、過去のコミット全部に間違った名前が残ります。
長い履歴を表示すると画面が止まったように見えることがあります。これは pager という表示プログラムが動いているためです。q キーで抜けられます。上下の移動は矢印キー、または j と k です。
git logを実行したのにfatal: your current branch 'main' does not have any commits yetと出たら、まだ 1 件もコミットしていない状態です。履歴が無いのでエラーではなく、正常な反応です。
1行で読む(--oneline)
コミットが 20 件を超えたあたりから、フル表示はかえって読みにくくなります。全体を俯瞰したいときは --oneline を使います。
ターミナル
$ git log --onelineプレーンテキスト
9f1c0a4 ログイン画面のバリデーションを追加
3b7d21e トップページの見出しを修正
c8e4f60 README に開発環境の手順を追加
1a2b3c4 最初のコミット1 コミット 1 行になり、ハッシュも先頭 7 桁に短縮されます。この 7 桁はそのままコマンドに渡せます。40 桁を全部打つ必要はありません。
件数を絞りたいときは -数字 を付けます。直近 5 件なら次のようになります。
ターミナル
$ git log --oneline -5日々の作業では、この git log --oneline -10 くらいが最もよく使う形です。まず全体を眺めて、気になるコミットを見つけたら、そのハッシュを使って詳しく調べる、という流れになります。
1つのコミットを詳しく見る(git show)
git log はコミットの見出しを並べるだけで、中身の差分までは出しません。特定のコミットで実際に何行変わったのかを見るには git show を使います。
ターミナル
$ git show 9f1c0a4プレーンテキスト
commit 9f1c0a4c6b3b2a1e5d8f7c6b5a4938271605f4e3
Author: Hanako Sato <hanako@example.com>
Date: Mon Jul 6 14:22:10 2026 +0900
ログイン画面のバリデーションを追加
diff --git a/src/login.js b/src/login.js
index 2f8a1b0..7c3d9e4 100644
--- a/src/login.js
+++ b/src/login.js
@@ -3,6 +3,9 @@ function login(email, password) {
+ if (!email.includes("@")) {
+ return { ok: false, message: "メールアドレスの形式が正しくありません" };
+ }
return request("/api/login", { email, password });
}+ で始まる行が追加された行、- で始まる行が削除された行です。これは git diff で見た表示と同じ読み方です。
git log に -p を付けると、すべてのコミットについてこの差分を続けて表示します。件数を絞らないと膨大になるので、git log -p -3 のように必ず件数と組み合わせてください。
差分の中身までは要らないが、どのファイルがどれだけ変わったかだけ知りたい、という場面もあります。そのときは --stat を使います。
ターミナル
$ git log --stat -2プレーンテキスト
commit 9f1c0a4c6b3b2a1e5d8f7c6b5a4938271605f4e3
Author: Hanako Sato <hanako@example.com>
Date: Mon Jul 6 14:22:10 2026 +0900
ログイン画面のバリデーションを追加
src/login.js | 3 +++
src/login.css | 1 +
2 files changed, 4 insertions(+)右側の数字と + の記号が、変更の規模を表しています。「このコミットは何を触ったのか」を素早くつかむには、-p よりこちらのほうが向いています。レビューの前に全体像を確認したいときによく使う形です。
枝分かれを見る(--graph)
このあとの章でブランチを扱いますが、履歴は一本道とは限りません。枝分かれと合流の形を確認したいときは --graph を足します。
ターミナル
$ git log --oneline --graph --allプレーンテキスト
* 7d4e1a2 feature/login をマージ
|\
| * 9f1c0a4 ログイン画面のバリデーションを追加
| * 5c2b8f1 ログインフォームを作成
|/
* 3b7d21e トップページの見出しを修正
* c8e4f60 README に開発環境の手順を追加左端の縦線と斜線が、コミットのつながりを表しています。--all を付けると、いま作業中のブランチ以外の履歴も含めて表示されます。付けないと、現在地から辿れる範囲だけになります。
ここで「現在地」と呼んでいるものが HEAD です。HEAD は「いま自分がどのコミットの上で作業しているか」を指し示す目印で、git log はこの HEAD から過去に向かって辿った結果を並べています。だから、まだ合流していない別ブランチのコミットは、--all を付けない限り出てきません。
履歴に出てこないコミットを見て「消えた」と早合点しないでください。多くの場合は現在地から辿れないだけです。本当に見失ったときの探し方は 消したはずの作業を取り戻す(reflog) で扱います。
目的のコミットを絞り込む
履歴が数百件になると、目で追うのは現実的ではありません。git log には絞り込みのオプションが揃っています。
| オプション | 何で絞るか | 例 |
|---|---|---|
-数字 | 件数 | git log -5 |
--author | 書いた人 | git log --author=hanako |
--since / --until | 期間 | git log --since="2026-07-01" |
--grep | コミットメッセージの語句 | git log --grep=ログイン |
-S | 追加または削除されたコード | git log -S "validateEmail" |
-- ファイル名 | 触れたファイル | git log -- src/login.js |
とくに覚えておきたいのが最後の 2 つです。
git log -- src/login.js は、そのファイルを変更したコミットだけを並べます。ハイフン 2 つの区切りは、あとに続くのがファイル名であってブランチ名ではない、と Git に伝えるためのものです。同じ名前のブランチとファイルがあっても取り違えません。
-S は「その文字列が増えた、または減ったコミット」を探します。validateEmail という関数がいつ書かれ、いつ消えたのかを知りたいときに使います。全文検索ではなく、変更の有無で探すのがポイントです。
ターミナル
$ git log --oneline -S "validateEmail"プレーンテキスト
9f1c0a4 ログイン画面のバリデーションを追加複数のオプションは同時に使えます。git log --oneline --author=hanako --since="2026-07-01" -- src/ のように重ねると、条件を積み上げて絞り込めます。
行単位で書いた人を追う(git blame)
git log はコミット単位の検索でした。これに対して「このファイルのこの行は、誰がいつ書いたのか」を行単位で知りたいときは git blame を使います。
ターミナル
$ git blame src/login.jsプレーンテキスト
3b7d21e8 (Hanako Sato 2026-07-06 11:08:44 +0900 1) function login(email, password) {
9f1c0a4c (Hanako Sato 2026-07-06 14:22:10 +0900 2) if (!email.includes("@")) {
9f1c0a4c (Hanako Sato 2026-07-06 14:22:10 +0900 3) return { ok: false };
3b7d21e8 (Hanako Sato 2026-07-06 11:08:44 +0900 4) }各行の先頭に、その行を最後に変更したコミットのハッシュ・書いた人・日時が並びます。意味の分からないコードに出会ったとき、その行のハッシュを控えて git show すれば、当時のコミットメッセージから意図を読み取れます。
名前の印象は強いですが、責任を追及するためのコマンドではありません。「なぜこう書いたのか」を当時の文脈から調べるための道具として使ってください。
やりがちな失敗と、その戻し方
よくあるのは、ファイル名の前の -- を忘れる失敗です。
ターミナル
$ git log src/login.jsこのファイルが存在していれば動きますが、削除済みのファイル名や、ブランチと同じ名前を渡すと次のように怒られます。
プレーンテキスト
fatal: ambiguous argument 'login': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git command [<revision>] -- [<path>]'エラーメッセージが対処法まで書いてくれています。-- を挟んで git log -- login と書き直せば解決します。Git のエラーは指示が具体的なことが多いので、まず読む習慣をつけてください。
もう 1 つ多いのが、表示の形を毎回打ち直す手間です。--oneline --graph --all は組み合わせが長いので、別名を登録しておくと楽になります。
ターミナル
$ git config --global alias.lg "log --oneline --graph --all -20"以後は git lg だけで同じ表示になります。この設定は Mac でも Windows でも同じコマンドで登録できます。
エイリアスは便利ですが、共同作業のときに相手の環境には存在しません。人に手順を伝えるときは、省略しない形のコマンドを書いてください。
履歴を読むときの考え方
git log は「調べる」ためのコマンドで、履歴を書き換えることはありません。何度実行してもリポジトリの状態は変わらないので、迷ったらまず git log --oneline を打つ、という進め方で安全です。
表示の形を自分で決めたいときは --pretty=format: が使えます。並べたい項目を記号で指定する書き方です。
ターミナル
$ git log --pretty=format:"%h %ad %an %s" --date=short -3プレーンテキスト
9f1c0a4 2026-07-06 Hanako Sato ログイン画面のバリデーションを追加
3b7d21e 2026-07-06 Hanako Sato トップページの見出しを修正
c8e4f60 2026-07-05 Hanako Sato README に開発環境の手順を追加%h は短縮ハッシュ、%ad は日付、%an は書いた人、%s はコミットメッセージの 1 行目です。--date=short で日付から時刻を落としています。作業報告に履歴を貼りたいときなど、決まった形で出力したい場面で役立ちます。
読むときの順番は次の 3 段階が基本です。
git log --oneline -20で全体の流れをつかむ- 気になるコミットのハッシュを控える
git show <ハッシュ>で、そのコミットの中身を確かめる
いまの状態を知りたいときは いまの状態を確かめる(status と diff)、過去の状態を知りたいときは git log、という住み分けで覚えると混乱しません。
そして、ここで読みやすい履歴が残っているかどうかは、過去の自分が書いたコミットメッセージの質で決まります。git log --oneline を眺めて意味が分からない行が並んでいたら、それは書き方を見直す合図です。書き方そのものは 良いコミットメッセージの書き方 で扱います。
git logはHEADから過去に辿れるコミットを、新しい順に並べる- 日常は
git log --oneline -10、枝分かれを見たいときは--graph --allを足す - 絞り込みは
--author--grep-S-- ファイル名を組み合わせる - 中身の差分を見るのは
git show <ハッシュ>。git log自体は履歴を変えないので何度でも安全に実行できる