歴史を読む — git log と git show
Claude Code の作業ログには、git log --oneline -3 や git show --stat が何度も出てきます。どれもコミットの歴史を見るだけのコマンドで、何も変えません。この回では、log の1行の読み方、括弧に出る付箋の意味、HEAD~1 のような「何個前」の書き方、1つのコミットの中身を見る show を順に押さえます。最後に、Claude Code がこれらのコマンドで何を確かめているのかを、コミットの前後の流れに沿って見ます。
- 上のターミナルは、実際に打ったときと同じ出力です(Git は英語で答えます)
- 下の中で起きていることは、Git の中を図にしたものです。丸がコミット、黒い札がブランチ、ピンクの札が HEAD です
- 右の説明をスクロールして読み進めると、左のターミナルでコマンドが1つずつ打たれます。
→キーでも1つずつ進みます(←で1つ戻ります。スマホでは「次へ」ボタン)。最後まで進んでから→を押すと次の区間へ移ります。黄色く光っているのが、そのステップで見てほしい場所です
1. git log — 新しい順に並ぶ歴史
この回で使う歴史は、買い物メモ todo.txt と店のメモ notes.txt の6つのコミットです。main は「バターを追加」まで5つ。feature は「パンを追加」から分かれて、「ジャムを追加」を1つ持っています。
git log は、HEAD から親を辿って、コミットを新しい順に並べます。ふつうは --oneline を付けて、1つのコミットを1行で読みます。
git log と --oneline・-N
この回の歴史です。
mainには5つのコミットがあり、featureは「パンを追加」から分かれて「ジャムを追加」を1つ持っています。HEAD はmainに乗っています。何も付けない
git logです。新しいコミットから順に、commitの後ろに ID、その下にメッセージが並びます。1つのコミットに何行も使うので、長い歴史では読みにくくなります。$ git log commit 71d9b3e (HEAD -> main) バターを追加 commit a1c4f20 店のメモを追加 commit e5c0a62 パンを追加 commit 8b41d07 卵を追加 commit 3f2a9c1 牛乳を追加--onelineを付けると、1つのコミットが1行 になります。左が ID の先頭7桁、右がメッセージで、上ほど新しいコミットです。$ git log --oneline 71d9b3e (HEAD -> main) バターを追加 a1c4f20 店のメモを追加 e5c0a62 パンを追加 8b41d07 卵を追加 3f2a9c1 牛乳を追加グラフにある「ジャムを追加」は出てきません。
git logは、HEAD から親を辿れるコミットだけ を並べるからです。「ジャムを追加」はmainの祖先ではありません。-3を付けると、新しい方から3つだけを出します。Claude Code がいちばんよく打つgit logがこの形です。$ git log --oneline -3 71d9b3e (HEAD -> main) バターを追加 a1c4f20 店のメモを追加 e5c0a62 パンを追加-1なら最新の1つだけです。いま HEAD にあるのがどのコミットかを、1行で確かめられます。$ git log --oneline -1 71d9b3e (HEAD -> main) バターを追加-n 2は-2と同じ意味です。どちらの書き方も見かけます。$ git log --oneline -n 2 71d9b3e (HEAD -> main) バターを追加 a1c4f20 店のメモを追加
注目してほしいのは、グラフにある「ジャムを追加」が出てこないことです。git log が並べるのは、HEAD から親を辿れるコミットだけです。歴史の全部ではありません。
| 書き方 | 出るもの |
|---|---|
git log | HEAD から辿れるコミットを全部。1つのコミットに何行も使う |
git log --oneline | 同じものを1行ずつ。左が ID の先頭(ふつうは7桁)、右がメッセージ |
git log --oneline -3 | 新しい方から3つだけ。-n 3 と書いても同じ |
git log --oneline -1 | 最新の1つだけ。いま HEAD にあるコミット |
2. 括弧の読み方と --all — 付箋がどこにあるか
git log の行の後ろに付く (HEAD -> main, feature) のような括弧は、そのコミットを指している付箋の一覧です。矢印の HEAD -> main は「HEAD が main に乗っていて、main がこのコミットを指している」という意味です。矢印の付かない名前は、付箋が貼ってあるだけのブランチです。
どこから辿るかも変えられます。後ろにブランチ名を書けばそのブランチから、--all を付ければすべてのブランチから辿ります。
括弧の読み方と --all・ブランチ指定
1行目の後ろに
(HEAD -> main)と出ています。括弧の中は、そのコミットを指している付箋 の一覧です。$ git log --oneline 71d9b3e (HEAD -> main) バターを追加 a1c4f20 店のメモを追加 e5c0a62 パンを追加 8b41d07 卵を追加 3f2a9c1 牛乳を追加HEAD -> mainの矢印は「HEAD がmainに乗っていて、mainがこのコミットを指している」という意味です。グラフの札の並びと同じことを、文字で書いています。$ git log --oneline -1 71d9b3e (HEAD -> main) バターを追加後ろにブランチ名を書くと、HEAD ではなく そのブランチから 親を辿ります。「ジャムを追加」が出て、「店のメモを追加」と「バターを追加」は出ません。括弧は
(feature)だけで、HEAD の矢印はありません。$ git log --oneline feature d2b7f48 (feature) ジャムを追加 e5c0a62 パンを追加 8b41d07 卵を追加 3f2a9c1 牛乳を追加--allは、すべてのブランチから辿れるコミット を並べます。グラフに見えているコミットが全部出ました。$ git log --oneline --all 71d9b3e (HEAD -> main) バターを追加 a1c4f20 店のメモを追加 d2b7f48 (feature) ジャムを追加 e5c0a62 パンを追加 8b41d07 卵を追加 3f2a9c1 牛乳を追加HEAD を
featureに乗り換えてから、もう一度見てみます。$ git switch feature Switched to branch 'feature'括弧が変わりました。「ジャムを追加」は
(HEAD -> feature)、「バターを追加」は(main)です。矢印が付いている方が、いま乗っているブランチ です。$ git log --oneline --all 71d9b3e (main) バターを追加 a1c4f20 店のメモを追加 d2b7f48 (HEAD -> feature) ジャムを追加 e5c0a62 パンを追加 8b41d07 卵を追加 3f2a9c1 牛乳を追加mainに戻しておきます。git logもgit switchも、コミットを1つも作らず、消しもしていません。$ git switch main Switched to branch 'main'
| 書き方 | どこから辿るか |
|---|---|
git log | HEAD(いま乗っているブランチ) |
git log feature | feature が指すコミット。HEAD は動かない |
git log --all | すべてのブランチ。グラフに見えているコミットが全部出る |
括弧は、グラフの札の並びを文字で書いたものです。矢印が付いている方が、いま乗っているブランチと覚えておけば、ターミナルだけでも「どこにいるか」が読めます。
3. HEAD~1・HEAD^ — 「何個前」の書き方
コミットは ID で指せますが、毎回 ID を調べて書くのは手間です。そこで、ある地点から「何個前」と数える書き方があります。
| 書き方 | 指すコミット | この回の歴史では |
|---|---|---|
HEAD~1 | HEAD の1つ前(親) | 店のメモを追加 |
HEAD~2 | HEAD の2つ前(親の親) | パンを追加 |
HEAD^ | HEAD~1 と同じ | 店のメモを追加 |
feature~1 | feature の1つ前 | パンを追加 |
HEAD~1・HEAD~2・HEAD^ — 何個前の書き方
コミットは ID で指せますが、毎回7桁を書くのは面倒です。そこで「HEAD から何個前」という書き方があります。
$ git log --oneline -3 71d9b3e (HEAD -> main) バターを追加 a1c4f20 店のメモを追加 e5c0a62 パンを追加HEAD~1は HEAD の1つ前(親)です。「店のメモを追加」が出ました。$ git log --oneline -1 HEAD~1 a1c4f20 店のメモを追加HEAD~2は2つ前、つまり親の親です。「パンを追加」です。$ git log --oneline -1 HEAD~2 e5c0a62 パンを追加HEAD^はHEAD~1と同じ意味です。~の後ろの数字が「何個前」です。$ git log --oneline -1 HEAD^ a1c4f20 店のメモを追加HEAD の代わりにブランチ名にも付けられます。
feature~1は「パンを追加」で、mainの2つ前と同じコミットです。ここが 2本のブランチの分かれ目 です。$ git log --oneline -1 feature~1 e5c0a62 パンを追加-1を外すと、HEAD~2から古い方へ全部を並べます。git logに書く rev は「どこから辿り始めるか」の指定です。$ git log --oneline HEAD~2 e5c0a62 パンを追加 8b41d07 卵を追加 3f2a9c1 牛乳を追加
~ は HEAD だけでなく、ブランチ名や ID の後ろにも付けられます。git log にこれを書くと「そこから古い方へ辿る」、git show や git diff に書くと「そのコミットを見る・比べる」という意味になります。
Claude Code の許可画面では、git reset --soft HEAD~1 のように、見るだけではないコマンドにも HEAD~1 が出てきます。どのコマンドでも HEAD~1 の意味は「HEAD の1つ前のコミット」です。何が起きるかは、前に付いているコマンドで決まります(reset は 1-5 の回で扱います)。
4. git show — 1つのコミットの中身
git log が「歴史の一覧」なら、git show は1つのコミットの中身を見るコマンドです。何も書かなければ HEAD のコミットを出し、メッセージの下に「親のコミットから何が変わったか」の差分を続けます。+ で始まる行が足された行、- で始まる行が消された行です。
git show と --stat・--name-only
git showは、1つのコミットの中身 を見るコマンドです。何も書かなければ HEAD のコミットを出します。見出しとメッセージの下に、親のコミットとの差分が続きます。$ git show commit 71d9b3e (HEAD -> main) バターを追加 diff --git a/notes.txt b/notes.txt --- a/notes.txt +++ b/notes.txt +バターは冷蔵の棚 diff --git a/todo.txt b/todo.txt --- a/todo.txt +++ b/todo.txt +バターを買う+で始まる行が、このコミットで足された行です。「バターを追加」ではtodo.txtとnotes.txtの2つのファイルに1行ずつ足しています。--statを付けると、差分の中身の代わりに ファイルごとの増減 だけが出ます。最後の行がその合計です。何ファイルを変えたコミットかが、すぐに分かります。$ git show --stat commit 71d9b3e (HEAD -> main) バターを追加 notes.txt | 1 + todo.txt | 1 + 2 files changed, 2 insertions(+)--name-onlyは、変わったファイルの名前だけを出します。$ git show --name-only commit 71d9b3e (HEAD -> main) バターを追加 notes.txt todo.txt見たいコミットを後ろに書けます。「店のメモを追加」で変わったのは
notes.txtだけです。$ git show --stat HEAD~1 commit a1c4f20 店のメモを追加 notes.txt | 1 + 1 file changed, 1 insertion(+)ID でも指せます。「卵を追加」は、
todo.txtに「卵を買う」を1行足したコミットでした。$ git show 8b41d07 commit 8b41d07 卵を追加 diff --git a/todo.txt b/todo.txt --- a/todo.txt +++ b/todo.txt +卵を買う
| 書き方 | 出るもの |
|---|---|
git show | HEAD のコミットのメッセージと、差分の中身 |
git show --stat | 差分の中身の代わりに、ファイルごとの増減と合計 |
git show --name-only | 変わったファイルの名前だけ |
git show HEAD~1 / git show 8b41d07 | 指定したコミットについて、同じものを出す |
--stat の1行は「ファイル名 | 変わった行数 + と - の数」です。差分を全部読まなくても、そのコミットが何ファイルにどれだけ触ったかが一目で分かります。
5. git diff コミット — あるコミットと今の作業ツリー
git diff は、何と何を比べるかを後ろの書き方で切り替えます。コミットを1つ書くと、そのコミットと今の作業ツリーを比べます。
| 書き方 | 比べるもの | 何が分かるか |
|---|---|---|
git diff | ステージ と 作業ツリー | まだ add していない変更 |
git diff --cached | HEAD と ステージ | 次のコミットに入る変更 |
git diff HEAD | HEAD と 作業ツリー | add したかどうかに関係なく、コミット以降の変更すべて |
git diff HEAD~2 | 2つ前のコミット と 作業ツリー | その時点から今までに変わったことすべて |
git diff コミット — あるコミットと今の作業ツリー
作業ツリーの
todo.txtに「チーズを買う」を書き足して、まだコミットしていない状態です。ステージに写します。作業ツリーとステージが同じ中身になりました。
$ git add todo.txt何も出ません。何も付けない
git diffは ステージと作業ツリー の差を見るので、add した後は空になります。$ git diffHEADを書くと、比べる相手が HEAD のコミット に変わります。add したかどうかに関係なく、コミット以降の変更がすべて出ます。$ git diff HEAD diff --git a/todo.txt b/todo.txt --- a/todo.txt +++ b/todo.txt +チーズを買うHEAD~1と今の作業ツリーを比べると、「バターを追加」で入れた2行とチーズの1行が、まとめて出ます。あるコミットから今までに何が変わったか を見る書き方です。$ git diff HEAD~1 diff --git a/notes.txt b/notes.txt --- a/notes.txt +++ b/notes.txt +バターは冷蔵の棚 diff --git a/todo.txt b/todo.txt --- a/todo.txt +++ b/todo.txt +バターを買う +チーズを買う--statはgit diffにも付けられます。「パンを追加」の時点から、2つのファイルが変わっています。$ git diff --stat HEAD~2 notes.txt | 2 ++ todo.txt | 2 ++ 2 files changed, 4 insertions(+)
add した後の git diff が空になるのは、ステージと作業ツリーが同じ中身になったからです。変更が消えたわけではありません。git diff HEAD や git diff --cached で見れば、ちゃんと出てきます。
6. Claude Code はこれで何を確かめているか
Claude Code の過去のセッションログから、実際に打った Git のコマンドを数えました(延べ約14,000回)。status・diff・log・show の見るだけのコマンドが全体の約6割を占めます。この回のコマンドに関係する分は、次のとおりです。
| コマンド | 回数 | 確かめていること |
|---|---|---|
git diff --stat | 719 | 何ファイルを何行ずつ変えたか。思っていないファイルまで変わっていないか |
git log --oneline -3 | 401 | 直前のコミットが歴史の先頭に入ったか。その前に何があったか |
git diff --cached --stat | 341 | これからコミットされる中身が意図どおりか |
git show --stat | 217 | いま作ったコミットが、何ファイルを変えたか |
git log --oneline -1 | 213 | いま HEAD にあるのがどのコミットか |
これらは、コミットの前後でひと続きの確認になっています。変更を --stat で数え、ステージを見てからコミットし、最後に log と show で「入ったか」「何を変えたか」を確かめます。
Claude Code がコミットの前後に確かめていること
Claude Code がファイルを書き換えたあとの状態です。まず
git statusで、どのファイルが変わったかを見ます。$ git status On branch main Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: todo.txt no changes added to commit (use "git add" and/or "git commit -a")次に
git diff --statで、何ファイルを何行ずつ変えたか を確かめます。思っていないファイルまで変わっていないかを見る一手です。$ git diff --stat todo.txt | 1 + 1 file changed, 1 insertion(+)コミットに入れるファイルをステージに写します。
$ git add todo.txt--cachedは HEAD とステージ の差です。これからコミットされる中身が、意図どおりかを最後に見ます。$ git diff --cached --stat todo.txt | 1 + 1 file changed, 1 insertion(+)コミットします。
mainが新しいコミットへ進みました。$ git commit -m "チーズを追加" [main 3387031] チーズを追加 1 file changed, 1 insertion(+)git log --oneline -3で、直前のコミットが歴史の先頭に入ったか を確かめます。1行目に(HEAD -> main)と「チーズを追加」が並んでいれば成功です。$ git log --oneline -3 3387031 (HEAD -> main) チーズを追加 71d9b3e バターを追加 a1c4f20 店のメモを追加最後に
git show --statで、そのコミットが 何ファイルを変えたか を見ます。todo.txtの1ファイルだけです。どれも見るだけのコマンドで、何も変えません。$ git show --stat commit 3387031 (HEAD -> main) チーズを追加 todo.txt | 1 + 1 file changed, 1 insertion(+)
許可画面にこの並びが出てきたら、Claude Code は自分の作業を読み返して確かめているところです。ターミナルの出力を一緒に読めば、何をコミットしたのかを人間の側でも追えます。
7. Claude Code の許可画面で見かけたら
この回のコマンドは、どれも見るだけです。コミットもブランチも、ファイルの中身も変えません。
| コマンド | 何が起きるか | 消えうるもの |
|---|---|---|
git log(--oneline / -3 / --all / ブランチ名・HEAD~2 の指定) | 歴史を並べて見る | なし |
git show(--stat / --name-only / コミットの指定) | 1つのコミットの中身を見る | なし |
git diff(--stat / --cached / コミットの指定) | 2つの場所の差を見る | なし |
気をつけるのは、HEAD~1 のような書き方が、見るだけではないコマンドの後ろにも付くことです。git log HEAD~1 は見るだけですが、git reset --hard HEAD~1 は付箋とファイルを動かします。判断は、後ろの書き方ではなく先頭のコマンドで行ってください。
まとめ
git logは HEAD から親を辿って新しい順に並べる。--onelineで1行ずつ、-3で新しい3つだけ- 行の後ろの括弧は、そのコミットを指す付箋。
HEAD -> mainの矢印が付いている方が、いま乗っているブランチ - ブランチ名を書けばそのブランチから、
--allなら全ブランチから辿る HEAD~1は1つ前、HEAD~2は2つ前。HEAD^はHEAD~1と同じgit showは1つのコミットの中身(既定は HEAD)。--statで何ファイルを変えたかだけ見られるgit diff コミットは、そのコミットと今の作業ツリーの差- Claude Code が打つ
git log --oneline -3やgit show --statは、コミットが入ったか・何を変えたかの確認。どれも何も消さない