Git blameの使い方を初心者向けに解説【変更履歴を行単位で追跡】
Git blameの基本的な使い方と実践的な活用方法を初心者向けに解説します。誰がいつどの行を変更したかを追跡できるblameコマンドは、バグ調査やコードレビューで欠かせないツールです。
git blameとは?
git blameは、ファイルの各行が「誰によって」「いつ」「どのコミットで」変更されたかを表示するコマンドです。コードの変更履歴を行単位で追跡できるため、バグの原因調査やコードの理解に非常に役立ちます。
「blame」は英語で「責める」という意味ですが、このコマンドは決して誰かを責めるためのものではありません。むしろ、コードの経緯を理解し、適切な人に質問するための「調査ツール」として使います。
git blameの基本的な使い方
ファイル全体の変更履歴を確認する
最も基本的な使い方は、ファイルパスを指定して実行することです:
git blame ファイル名
実行例:
git blame src/app.ts
出力例:
a1b2c3d4 (山田太郎 2025-12-01 10:30:45 +0900 1) import express from 'express';
e5f6g7h8 (鈴木花子 2025-12-15 14:20:30 +0900 2) import cors from 'cors';
a1b2c3d4 (山田太郎 2025-12-01 10:30:45 +0900 3)
i9j0k1l2 (佐藤次郎 2026-01-03 09:15:00 +0900 4) const app = express();
e5f6g7h8 (鈴木花子 2025-12-15 14:20:30 +0900 5) app.use(cors());
各行には以下の情報が含まれています:
| 項目 | 説明 | 例 |
|---|---|---|
| コミットハッシュ | 変更を行ったコミットの短縮ID | a1b2c3d4 |
| 作成者名 | 変更を行った人の名前 | 山田太郎 |
| 日時 | 変更が行われた日時 | 2025-12-01 10:30:45 |
| 行番号 | ファイル内での行番号 | 1 |
| コード内容 | 実際のコードの内容 | import express... |
特定の行範囲だけを確認する
ファイルが大きい場合、特定の行範囲だけを確認したいことがあります。-Lオプションで行範囲を指定できます:
# 10行目から20行目までを表示
git blame -L 10,20 src/app.ts
# 10行目から15行分を表示
git blame -L 10,+15 src/app.ts
メールアドレスを表示する
作成者の情報としてメールアドレスを表示したい場合は、-eオプションを使います:
git blame -e src/app.ts
出力例:
a1b2c3d4 (<yamada@example.com> 2025-12-01 10:30:45 +0900 1) import express from 'express';
便利なオプション一覧
git blameには多くの便利なオプションがあります。よく使うものを紹介します。
| オプション | 説明 | 使用例 |
|---|---|---|
-L 開始,終了 | 行範囲を指定 | git blame -L 10,20 file.ts |
-e | メールアドレスを表示 | git blame -e file.ts |
-w | 空白の変更を無視 | git blame -w file.ts |
-M | 同一ファイル内の移動を検出 | git blame -M file.ts |
-C | 他ファイルからのコピーを検出 | git blame -C file.ts |
--date=short | 日付のみ表示(時刻なし) | git blame --date=short file.ts |
-s | 作成者と日時を省略 | git blame -s file.ts |
空白の変更を無視する(-wオプション)
インデントの修正やフォーマット変更だけを行ったコミットは、コードの本質的な変更ではないことが多いです。-wオプションを使うと、空白の変更を無視して、実質的な変更者を特定できます:
git blame -w src/app.ts
コードの移動・コピーを追跡する(-M、-Cオプション)
リファクタリングでコードを別の場所に移動した場合、通常のblameでは移動先のコミットが表示されます。しかし、-Mや-Cオプションを使うと、元々のコードを書いた人を追跡できます:
# ファイル内でのコード移動を追跡
git blame -M src/app.ts
# 他のファイルからのコピーも追跡
git blame -C src/app.ts
# より積極的にコピー元を探す
git blame -C -C src/app.ts
実践的な活用シーン
シーン1: バグの原因を調査する
バグが発見されたとき、該当箇所がいつ、誰によって変更されたかを調べることで、問題の原因を特定しやすくなります。
# バグがある行を特定したら、その周辺をblameで確認
git blame -L 45,55 src/utils/validation.ts
見つかったコミットの詳細を確認したい場合は、git showを使います:
git show a1b2c3d4
これで、そのコミットで行われた全ての変更と、コミットメッセージを確認できます。
シーン2: コードの意図を理解する
「なぜこのコードがこうなっているのか」を理解したいとき、blameで変更者とコミットを特定し、コミットメッセージから意図を読み取ることができます。
# 気になるコードの変更履歴を確認
git blame -L 100,110 src/services/auth.ts
# 関連するコミットメッセージを確認
git log --oneline a1b2c3d4
シーン3: コードレビューの準備
プルリクエストをレビューする際、変更箇所の背景を理解するためにblameを活用できます。
# 変更されたファイルの履歴を確認
git blame src/components/Button.tsx
初心者が混乱しやすいポイント
「blame」は責めることではない
「blame」という言葉から、誰かのミスを追及するツールと誤解されがちですが、実際は違います。git blameの目的は以下のとおりです:
- コードの経緯を理解する
- 質問すべき適切な人を見つける
- バグの原因となった変更を特定する
- リファクタリングの影響範囲を把握する
コードを書いた人を非難するためではなく、チームでのコミュニケーションを円滑にするためのツールとして使いましょう。
blameとlogの使い分け
git blameとgit logは似ているようで、用途が異なります:
| コマンド | 用途 | 出力内容 |
|---|---|---|
| git blame | 特定の行の変更者を調べる | 行ごとの作成者・日時・コミット |
| git log | ファイルの変更履歴を見る | コミット一覧(時系列) |
| git show | コミットの詳細を見る | 差分とコミットメッセージ |
リネーム・移動されたファイルの追跡
ファイルがリネームや移動された場合、通常のblameでは移動後の履歴しか表示されません。移動前の履歴も追跡したい場合は、-Cオプションを使うか、git log --followでファイル履歴を確認してから該当コミットを調べます。
# ファイルのリネーム履歴を含めて確認
git log --follow --oneline src/newName.ts
# コピー元も追跡してblame
git blame -C -C src/newName.ts
マージコミットの表示
マージコミットが表示された場合、それは「その行がマージで取り込まれた」ことを意味します。実際にコードを書いたコミットを知りたい場合は、マージ元のブランチを確認するか、git logで詳しく調べましょう。
GUIツールでのblame確認
コマンドラインでのblameに慣れない場合、GUIツールを使うとより直感的に確認できます。
多くのGitクライアントやIDEには、blameを視覚的に表示する機能があります:
- VS Code: GitLens拡張機能で、エディタ上に直接blame情報を表示
- GitHub: ファイル表示画面で「Blame」ボタンをクリック
- GitKraken / Sourcetree: ファイルを右クリックして「Blame」を選択
特にGitHubのblame表示は、コミットへのリンクが簡単にたどれるため便利です。
よくある問題と対策
問題1: フォーマット変更で全行が同じ人になる
コードフォーマッタを適用すると、多くの行が変更されたことになり、blameで元の作成者が分からなくなることがあります。
対策: -wオプションで空白変更を無視するか、.git-blame-ignore-revsファイルを設定して特定のコミットを除外します。
# .git-blame-ignore-revsファイルを作成
echo "# フォーマット適用コミット" > .git-blame-ignore-revs
echo "abc123def456..." >> .git-blame-ignore-revs
# 設定を有効化
git config blame.ignoreRevsFile .git-blame-ignore-revs
問題2: 出力が多すぎて見づらい
大きなファイルでblameを実行すると、出力が多すぎて見づらいことがあります。
対策: -Lオプションで行範囲を絞るか、lessコマンドと組み合わせてページング表示します。
git blame src/largeFile.ts | less
問題3: 古いコミットが表示されない
リポジトリをshallow clone(履歴を制限してclone)した場合、古いコミットの情報が取得できません。
対策: 完全な履歴を取得します。
git fetch --unshallow
まとめ
git blameは、コードの変更履歴を行単位で追跡できる強力なツールです。
覚えておきたいポイント:
git blame ファイル名で各行の作成者・日時・コミットを確認できる-Lオプションで特定の行範囲に絞れる-wオプションで空白変更を無視できる-Mや-Cオプションでコードの移動・コピーを追跡できる- 「責める」ためではなく、「調査・理解する」ためのツール
バグ調査やコードレビューの際にblameを活用することで、効率的に問題の原因を特定し、適切な人に質問できるようになります。ぜひ日常の開発で活用してみてください。
編集部