症状

「このコードは誰がいつ書いたのか」「特定の行の変更履歴を追いたい」ときに git blame の使い方がわからない

結論:まずこれを確認

    git blame -L 行番号,行番号 ファイル名
  

これで特定行の最終変更者・コミットを確認できる。

操作フロー

    flowchart TD
    A[特定行の履歴を調べたい] --> B{調べたい範囲は?}
    B -->|1行だけ| C[git blame -L n,n ファイル]
    B -->|複数行| D[git blame -L n,m ファイル]
    C --> E{さらに前の履歴を見たい?}
    D --> E
    E -->|Yes| F[git blame コミットID^ -L n,n ファイル]
    E -->|No| G[完了]
    F --> H{まだ遡りたい?}
    H -->|Yes| F
    H -->|No| G
  

よくある原因

  • 行番号の指定方法がわからない-L オプションを使う
  • ファイル全体が表示されて見づらい — 行範囲を絞ると解決
  • 変更前のコミットを見たい — コミットID^ で1つ前を指定
  • リネーム前のファイルを追えない-C オプションで追跡可能
  • 移動されたコードの元を知りたい-C -C -C で検出範囲を拡大
  • 空白変更が邪魔-w オプションで無視できる
  • 出力が長すぎる — ページャーや行指定で絞る

操作手順

ステップ1: 対象ファイルの行番号を確認する

エディタや cat -n で行番号を確認する。

    cat -n src/main.py | head -50
  

🔍 チェックポイント: 調べたい行の番号をメモしておく

ステップ2: 特定の1行を blame する

    git blame -L 42,42 src/main.py
  

出力例:

    a1b2c3d4 (山田太郎 2025-12-01 10:30:00 +0900 42) def calculate_total():
  

🔍 チェックポイント: コミットID、作者名、日時、行内容が表示される

ステップ3: 複数行の範囲を blame する

    git blame -L 40,50 src/main.py
  

🔍 チェックポイント: 40行目から50行目までの変更履歴が表示される

ステップ4: さらに前の変更履歴を遡る

表示されたコミットの1つ前を調べる場合:

    git blame a1b2c3d4^ -L 42,42 src/main.py
  
  • ^ はそのコミットの親(1つ前)を意味する
  • ~2 で2つ前、~3 で3つ前も指定可能

🔍 チェックポイント: 別のコミットIDと作者が表示されれば、さらに前の変更者がわかる

ステップ5: リネーム・移動されたコードを追跡する

ファイル名が変更されていた場合:

    git blame -C -L 42,42 src/main.py
  

さらに別ファイルからのコピーも検出したい場合:

    git blame -C -C -C -L 42,42 src/main.py
  

🔍 チェックポイント: 出力にリネーム元のファイル名が表示されることがある

ステップ6: 空白変更を無視して blame する

インデント変更だけのコミットを飛ばしたい場合:

    git blame -w -L 42,42 src/main.py
  

🔍 チェックポイント: 空白だけの変更コミットがスキップされる

ステップ7: 詳細なコミット内容を確認する

blame で見つけたコミットの全体像を確認:

    git show a1b2c3d4
  

🔍 チェックポイント: コミットメッセージと変更差分が表示される

NG行動

  • 行番号を確認せずに blame を実行する — 誤った行を調べてしまう
  • ファイル全体を blame して目視で探す — 時間がかかり見落としやすい
  • ^~ を混同する^ は親、~n はn世代前。意味が異なる
  • 古いコミットを遡りすぎて混乱する — 必要な範囲で止める

よくある質問(FAQ)

Q1: GUI で blame を見る方法は?

A: GitHub や GitLab ではファイル表示画面の「Blame」ボタンから確認できる。VS Code なら GitLens 拡張機能が便利。

Q2: 関数名で範囲指定できる?

A: -L :関数名:ファイル名 で可能(言語によっては動作しない場合あり)。

    git blame -L :calculate_total:src/main.py
  

Q3: blame の結果をファイルに保存したい

A: リダイレクトを使う。

    git blame -L 40,50 src/main.py > blame_result.txt
  

関連するトラブル

準備中

解決しない場合