歴史を読む — 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

  1. この回の歴史です。main には5つのコミットがあり、feature は「パンを追加」から分かれて「ジャムを追加」を1つ持っています。HEAD は main に乗っています。

  2. 何も付けない git log です。新しいコミットから順に、commit の後ろに ID、その下にメッセージが並びます。1つのコミットに何行も使うので、長い歴史では読みにくくなります。

    $ git log
    commit 71d9b3e (HEAD -> main)
    
        バターを追加
    
    commit a1c4f20
    
        店のメモを追加
    
    commit e5c0a62
    
        パンを追加
    
    commit 8b41d07
    
        卵を追加
    
    commit 3f2a9c1
    
        牛乳を追加
  3. --oneline を付けると、1つのコミットが1行 になります。左が ID の先頭7桁、右がメッセージで、上ほど新しいコミットです。

    $ git log --oneline
    71d9b3e (HEAD -> main) バターを追加
    a1c4f20 店のメモを追加
    e5c0a62 パンを追加
    8b41d07 卵を追加
    3f2a9c1 牛乳を追加
  4. グラフにある「ジャムを追加」は出てきません。git log は、HEAD から親を辿れるコミットだけ を並べるからです。「ジャムを追加」は main の祖先ではありません。

  5. -3 を付けると、新しい方から3つだけを出します。Claude Code がいちばんよく打つ git log がこの形です。

    $ git log --oneline -3
    71d9b3e (HEAD -> main) バターを追加
    a1c4f20 店のメモを追加
    e5c0a62 パンを追加
  6. -1 なら最新の1つだけです。いま HEAD にあるのがどのコミットかを、1行で確かめられます。

    $ git log --oneline -1
    71d9b3e (HEAD -> main) バターを追加
  7. -n 2 は -2 と同じ意味です。どちらの書き方も見かけます。

    $ git log --oneline -n 2
    71d9b3e (HEAD -> main) バターを追加
    a1c4f20 店のメモを追加

注目してほしいのは、グラフにある「ジャムを追加」が出てこないことです。git log が並べるのは、HEAD から親を辿れるコミットだけです。歴史の全部ではありません。

書き方出るもの
git logHEAD から辿れるコミットを全部。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. 1行目の後ろに (HEAD -> main) と出ています。括弧の中は、そのコミットを指している付箋 の一覧です。

    $ git log --oneline
    71d9b3e (HEAD -> main) バターを追加
    a1c4f20 店のメモを追加
    e5c0a62 パンを追加
    8b41d07 卵を追加
    3f2a9c1 牛乳を追加
  2. HEAD -> main の矢印は「HEAD が main に乗っていて、main がこのコミットを指している」という意味です。グラフの札の並びと同じことを、文字で書いています。

    $ git log --oneline -1
    71d9b3e (HEAD -> main) バターを追加
  3. 後ろにブランチ名を書くと、HEAD ではなく そのブランチから 親を辿ります。「ジャムを追加」が出て、「店のメモを追加」と「バターを追加」は出ません。括弧は (feature) だけで、HEAD の矢印はありません。

    $ git log --oneline feature
    d2b7f48 (feature) ジャムを追加
    e5c0a62 パンを追加
    8b41d07 卵を追加
    3f2a9c1 牛乳を追加
  4. --all は、すべてのブランチから辿れるコミット を並べます。グラフに見えているコミットが全部出ました。

    $ git log --oneline --all
    71d9b3e (HEAD -> main) バターを追加
    a1c4f20 店のメモを追加
    d2b7f48 (feature) ジャムを追加
    e5c0a62 パンを追加
    8b41d07 卵を追加
    3f2a9c1 牛乳を追加
  5. HEAD を feature に乗り換えてから、もう一度見てみます。

    $ git switch feature
    Switched to branch 'feature'
  6. 括弧が変わりました。「ジャムを追加」は (HEAD -> feature)、「バターを追加」は (main) です。矢印が付いている方が、いま乗っているブランチ です。

    $ git log --oneline --all
    71d9b3e (main) バターを追加
    a1c4f20 店のメモを追加
    d2b7f48 (HEAD -> feature) ジャムを追加
    e5c0a62 パンを追加
    8b41d07 卵を追加
    3f2a9c1 牛乳を追加
  7. main に戻しておきます。git log も git switch も、コミットを1つも作らず、消しもしていません。

    $ git switch main
    Switched to branch 'main'
書き方どこから辿るか
git logHEAD(いま乗っているブランチ)
git log featurefeature が指すコミット。HEAD は動かない
git log --allすべてのブランチ。グラフに見えているコミットが全部出る

括弧は、グラフの札の並びを文字で書いたものです。矢印が付いている方が、いま乗っているブランチと覚えておけば、ターミナルだけでも「どこにいるか」が読めます。

3. HEAD~1・HEAD^ — 「何個前」の書き方

コミットは ID で指せますが、毎回 ID を調べて書くのは手間です。そこで、ある地点から「何個前」と数える書き方があります。

書き方指すコミットこの回の歴史では
HEAD~1HEAD の1つ前(親)店のメモを追加
HEAD~2HEAD の2つ前(親の親)パンを追加
HEAD^HEAD~1 と同じ店のメモを追加
feature~1feature の1つ前パンを追加

HEAD~1・HEAD~2・HEAD^ — 何個前の書き方

  1. コミットは ID で指せますが、毎回7桁を書くのは面倒です。そこで「HEAD から何個前」という書き方があります。

    $ git log --oneline -3
    71d9b3e (HEAD -> main) バターを追加
    a1c4f20 店のメモを追加
    e5c0a62 パンを追加
  2. HEAD~1 は HEAD の1つ前(親)です。「店のメモを追加」が出ました。

    $ git log --oneline -1 HEAD~1
    a1c4f20 店のメモを追加
  3. HEAD~2 は2つ前、つまり親の親です。「パンを追加」です。

    $ git log --oneline -1 HEAD~2
    e5c0a62 パンを追加
  4. HEAD^ は HEAD~1 と同じ意味です。~ の後ろの数字が「何個前」です。

    $ git log --oneline -1 HEAD^
    a1c4f20 店のメモを追加
  5. HEAD の代わりにブランチ名にも付けられます。feature~1 は「パンを追加」で、main の2つ前と同じコミットです。ここが 2本のブランチの分かれ目 です。

    $ git log --oneline -1 feature~1
    e5c0a62 パンを追加
  6. -1 を外すと、HEAD~2 から古い方へ全部を並べます。git log に書く rev は「どこから辿り始めるか」の指定です。

    $ git log --oneline HEAD~2
    e5c0a62 パンを追加
    8b41d07 卵を追加
    3f2a9c1 牛乳を追加

~ は HEAD だけでなく、ブランチ名や ID の後ろにも付けられます。git log にこれを書くと「そこから古い方へ辿る」、git show や git diff に書くと「そのコミットを見る・比べる」という意味になります。

許可画面の HEAD~1 は「1つ前」

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

  1. 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
    +バターを買う
  2. + で始まる行が、このコミットで足された行です。「バターを追加」では todo.txt と notes.txt の2つのファイルに1行ずつ足しています。

  3. --stat を付けると、差分の中身の代わりに ファイルごとの増減 だけが出ます。最後の行がその合計です。何ファイルを変えたコミットかが、すぐに分かります。

    $ git show --stat
    commit 71d9b3e (HEAD -> main)
    
        バターを追加
    
     notes.txt | 1 +
     todo.txt  | 1 +
     2 files changed, 2 insertions(+)
  4. --name-only は、変わったファイルの名前だけを出します。

    $ git show --name-only
    commit 71d9b3e (HEAD -> main)
    
        バターを追加
    
    notes.txt
    todo.txt
  5. 見たいコミットを後ろに書けます。「店のメモを追加」で変わったのは notes.txt だけです。

    $ git show --stat HEAD~1
    commit a1c4f20
    
        店のメモを追加
    
     notes.txt | 1 +
     1 file changed, 1 insertion(+)
  6. ID でも指せます。「卵を追加」は、todo.txt に「卵を買う」を1行足したコミットでした。

    $ git show 8b41d07
    commit 8b41d07
    
        卵を追加
    
    diff --git a/todo.txt b/todo.txt
    --- a/todo.txt
    +++ b/todo.txt
    +卵を買う
書き方出るもの
git showHEAD のコミットのメッセージと、差分の中身
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 --cachedHEAD と ステージ次のコミットに入る変更
git diff HEADHEAD と 作業ツリーadd したかどうかに関係なく、コミット以降の変更すべて
git diff HEAD~22つ前のコミット と 作業ツリーその時点から今までに変わったことすべて

git diff コミット — あるコミットと今の作業ツリー

  1. 作業ツリーの todo.txt に「チーズを買う」を書き足して、まだコミットしていない状態です。

  2. ステージに写します。作業ツリーとステージが同じ中身になりました。

    $ git add todo.txt
  3. 何も出ません。何も付けない git diff は ステージと作業ツリー の差を見るので、add した後は空になります。

    $ git diff
  4. HEAD を書くと、比べる相手が HEAD のコミット に変わります。add したかどうかに関係なく、コミット以降の変更がすべて出ます。

    $ git diff HEAD
    diff --git a/todo.txt b/todo.txt
    --- a/todo.txt
    +++ b/todo.txt
    +チーズを買う
  5. 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
    +バターを買う
    +チーズを買う
  6. --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 --stat719何ファイルを何行ずつ変えたか。思っていないファイルまで変わっていないか
git log --oneline -3401直前のコミットが歴史の先頭に入ったか。その前に何があったか
git diff --cached --stat341これからコミットされる中身が意図どおりか
git show --stat217いま作ったコミットが、何ファイルを変えたか
git log --oneline -1213いま HEAD にあるのがどのコミットか

これらは、コミットの前後でひと続きの確認になっています。変更を --stat で数え、ステージを見てからコミットし、最後に log と show で「入ったか」「何を変えたか」を確かめます。

Claude Code がコミットの前後に確かめていること

  1. 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")
  2. 次に git diff --stat で、何ファイルを何行ずつ変えたか を確かめます。思っていないファイルまで変わっていないかを見る一手です。

    $ git diff --stat
     todo.txt | 1 +
     1 file changed, 1 insertion(+)
  3. コミットに入れるファイルをステージに写します。

    $ git add todo.txt
  4. --cached は HEAD とステージ の差です。これからコミットされる中身が、意図どおりかを最後に見ます。

    $ git diff --cached --stat
     todo.txt | 1 +
     1 file changed, 1 insertion(+)
  5. コミットします。main が新しいコミットへ進みました。

    $ git commit -m "チーズを追加"
    [main 3387031] チーズを追加
     1 file changed, 1 insertion(+)
  6. git log --oneline -3 で、直前のコミットが歴史の先頭に入ったか を確かめます。1行目に (HEAD -> main) と「チーズを追加」が並んでいれば成功です。

    $ git log --oneline -3
    3387031 (HEAD -> main) チーズを追加
    71d9b3e バターを追加
    a1c4f20 店のメモを追加
  7. 最後に 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 は、コミットが入ったか・何を変えたかの確認。どれも何も消さない