はじめに

「このコードはいつ、誰が、なぜ変更したのか」という疑問は、チーム開発において日常的に発生します。バグの原因調査、機能の経緯確認、コードレビューなど、変更履歴の追跡はソフトウェア開発に欠かせないスキルです。

本記事では、Gitの履歴操作コマンドを体系的に解説します。git logでコミット履歴を閲覧し、git diffで変更内容を比較し、git showで特定のコミットを詳細に確認し、git blameで各行の変更者を特定する方法を実践例とともに紹介します。この記事を読み終えると、以下のことができるようになります。

  • git logのオプションを使いこなして効率的に履歴を検索できる
  • git diffで作業ツリー、ステージングエリア、コミット間の差分を確認できる
  • git showで特定のコミットやファイルの内容を表示できる
  • git blameでコードの各行がいつ誰によって変更されたかを特定できる

実行環境と前提条件

本記事の内容は、以下の環境で動作確認を行っています。

項目 要件
Git 2.40以上
OS Windows 10/11、macOS 12以上、Ubuntu 22.04以上
ターミナル コマンドプロンプト、PowerShell、Terminal.app、bash等
エディタ VS Code推奨

前提条件として、以下の知識があることを想定しています。

  • コマンドライン操作の基礎知識(cdls/dirmkdir等)
  • テキストエディタの基本操作
  • Gitの基本コマンド(git initgit addgit commitgit status)の理解

履歴操作コマンドの概要

Gitでコードの変更履歴を追跡するには、主に以下の4つのコマンドを使用します。

コマンド 用途 主な使用場面
git log コミット履歴の閲覧 過去の変更を時系列で確認
git diff 変更内容の比較 作業中の変更やコミット間の差分確認
git show 特定オブジェクトの表示 コミットの詳細やファイル内容の確認
git blame 行ごとの変更者特定 バグの原因調査や変更経緯の追跡

これらのコマンドを組み合わせることで、「いつ」「誰が」「何を」「なぜ」変更したのかを効率的に調査できます。

git log - コミット履歴の閲覧

git logは、リポジトリのコミット履歴を時系列で表示するコマンドです。多彩なオプションを活用することで、必要な情報を効率的に抽出できます。

基本的な使い方

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 基本的なログ表示
git log

# 出力例
commit 4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b (HEAD -> main)
Author: John Doe <john@example.com>
Date:   Mon Jan 1 12:00:00 2026 +0900

    ユーザー認証機能を追加

commit 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
Author: Jane Smith <jane@example.com>
Date:   Sun Dec 31 18:30:00 2025 +0900

    READMEを更新

デフォルトでは、各コミットのハッシュ、作成者、日時、コミットメッセージが表示されます。

表示形式のカスタマイズ

履歴を見やすく表示するためのオプションを紹介します。

1
2
3
4
5
6
7
# 1行で簡潔に表示
git log --oneline

# 出力例
4a5b6c7 (HEAD -> main) ユーザー認証機能を追加
1a2b3c4 READMEを更新
8e9f0a1 初期コミット
1
2
3
4
5
6
7
8
9
# ブランチの分岐をグラフで可視化
git log --oneline --graph --all

# 出力例
* 4a5b6c7 (HEAD -> main) ユーザー認証機能を追加
| * 7d8e9f0 (feature/login) ログインフォームを実装
|/
* 1a2b3c4 READMEを更新
* 8e9f0a1 初期コミット
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 変更されたファイル名を表示
git log --oneline --name-status

# 出力例
4a5b6c7 ユーザー認証機能を追加
M       src/auth.js
A       src/login.js

1a2b3c4 READMEを更新
M       README.md

--name-statusオプションでは、ファイルの状態が以下の記号で表示されます。

記号 意味
A 追加(Added)
M 変更(Modified)
D 削除(Deleted)
R 名前変更(Renamed)

カスタムフォーマットの指定

--pretty=formatオプションを使うと、出力形式を自由にカスタマイズできます。

1
2
3
4
5
6
# カスタムフォーマットで表示
git log --pretty=format:"%h - %an, %ar : %s"

# 出力例
4a5b6c7 - John Doe, 2 hours ago : ユーザー認証機能を追加
1a2b3c4 - Jane Smith, 3 days ago : READMEを更新

よく使用するプレースホルダーは以下のとおりです。

プレースホルダー 内容
%H コミットハッシュ(完全版)
%h コミットハッシュ(短縮版)
%an 作成者名
%ae 作成者メールアドレス
%ar 作成日(相対表記)
%ad 作成日(絶対表記)
%s コミットメッセージ(1行目)
%b コミットメッセージ(本文)

コミット数の制限

1
2
3
4
5
# 最新の5件のみ表示
git log -5

# 最新の3件を1行表示
git log -3 --oneline

日付による絞り込み

1
2
3
4
5
6
7
8
# 2025年12月1日以降のコミット
git log --since="2025-12-01"

# 過去2週間のコミット
git log --since="2 weeks ago"

# 特定期間のコミット
git log --since="2025-12-01" --until="2025-12-31"

作成者による絞り込み

1
2
3
4
5
# 特定の作成者のコミットのみ表示
git log --author="John"

# 複数の作成者で絞り込み(正規表現)
git log --author="John\|Jane"

コミットメッセージによる検索

1
2
3
4
5
# メッセージに「fix」を含むコミット
git log --grep="fix"

# 大文字小文字を区別しない検索
git log --grep="bug" -i

特定ファイルの履歴

1
2
3
4
5
# 特定ファイルの変更履歴
git log -- src/auth.js

# ファイル名変更を追跡
git log --follow -- src/auth.js

--followオプションを使用すると、ファイル名が変更された場合でも変更履歴を追跡できます。

変更内容による検索

特定のコード変更を含むコミットを検索できます。

1
2
3
4
5
# 特定の文字列が追加または削除されたコミット
git log -S "function login"

# 正規表現でパッチ内容を検索
git log -G "login\(\)" --oneline

-Sオプション(pickaxe)は、指定した文字列の出現回数が変化したコミットを検索します。-Gオプションは、パッチ内容が正規表現にマッチするコミットを検索します。

差分付きで履歴を表示

1
2
3
4
5
6
7
8
# 各コミットの差分を表示
git log -p

# 最新3件の差分を表示
git log -3 -p

# 統計情報付きで表示
git log --stat

実用的なエイリアス設定

よく使うgit logの形式をエイリアスとして登録しておくと便利です。

1
2
3
4
5
# グラフ付き1行表示のエイリアス
git config --global alias.lg "log --oneline --graph --all --decorate"

# 使用例
git lg

git diff - 変更内容の比較

git diffは、ファイルの変更内容を比較して差分を表示するコマンドです。作業ツリー、ステージングエリア、コミット間など、さまざまな状態を比較できます。

差分の種類を理解する

Gitには3つの状態があり、それぞれの間で差分を確認できます。

作業ツリー ─── ステージングエリア ─── リポジトリ(コミット済み)
    │              │                    │
    └── git diff ──┘                    │
                   │                    │
                   └── git diff --staged ┘
    │                                   │
    └────────── git diff HEAD ──────────┘

作業ツリーとステージングエリアの差分

まだステージングされていない変更を確認します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 作業ツリーの変更を確認
git diff

# 出力例
diff --git a/src/app.js b/src/app.js
index 1234567..89abcde 100644
--- a/src/app.js
+++ b/src/app.js
@@ -10,6 +10,8 @@ function main() {
     console.log("Starting application");
+    // 新しいログを追加
+    console.log("Version 2.0");
     initialize();
 }

差分の読み方は以下のとおりです。

記号 意味
--- 変更前のファイル
+++ 変更後のファイル
@@ 変更箇所の位置情報
- 削除された行
+ 追加された行

ステージングエリアとHEADの差分

次のコミットに含まれる変更を確認します。

1
2
3
4
5
# ステージング済みの変更を確認
git diff --staged

# --cachedも同じ意味
git diff --cached

作業ツリーとHEADの差分

最後のコミットからの全変更を確認します。

1
2
# HEADとの差分を確認
git diff HEAD

特定ファイルの差分

1
2
3
4
5
# 特定ファイルの差分のみ表示
git diff src/app.js

# 複数ファイルを指定
git diff src/app.js src/utils.js

コミット間の差分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 2つのコミット間の差分
git diff abc1234 def5678

# HEADと特定コミットの差分
git diff abc1234 HEAD

# 1つ前のコミットとの差分
git diff HEAD~1 HEAD

# 省略形式(..を使用)
git diff HEAD~1..HEAD

ブランチ間の差分

1
2
3
4
5
6
7
8
# 2つのブランチ間の差分
git diff main feature/login

# 現在のブランチとmainの差分
git diff main

# 共通の祖先からの差分(3点ドット)
git diff main...feature/login

..(2点ドット)と...(3点ドット)の違いは重要です。

  • main..feature:mainからfeatureへの直接的な差分
  • main...feature:mainとfeatureの共通祖先からfeatureへの差分

差分の統計情報

1
2
3
4
5
6
7
# 変更ファイルと行数の統計
git diff --stat

# 出力例
 src/app.js   | 15 +++++++++------
 src/utils.js |  8 ++++++++
 2 files changed, 17 insertions(+), 6 deletions(-)
1
2
3
4
5
# 変更されたファイル名のみ表示
git diff --name-only

# ファイル名と変更種別を表示
git diff --name-status

空白の無視

1
2
3
4
5
6
7
8
# 行末の空白変更を無視
git diff --ignore-space-at-eol

# 空白の量の変更を無視
git diff -b

# すべての空白を無視
git diff -w

単語単位の差分

1
2
3
4
5
# 単語単位で差分を表示
git diff --word-diff

# 出力例
console.log("Hello [-World-]{+Everyone+}");

差分のフィルタリング

1
2
3
4
5
6
7
8
# 追加されたファイルのみ表示
git diff --diff-filter=A

# 変更されたファイルのみ表示
git diff --diff-filter=M

# 削除されたファイルのみ表示
git diff --diff-filter=D

実用的な使用例

1
2
3
4
5
6
7
8
# コミット前の最終確認
git diff --staged

# プルリクエスト作成前のレビュー
git diff main...HEAD

# 特定の拡張子のファイルのみ確認
git diff -- "*.js"

git show - コミットの詳細表示

git showは、コミット、タグ、ツリーなど、さまざまなGitオブジェクトの内容を表示するコマンドです。

コミットの詳細を表示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 最新コミットの詳細
git show

# 出力例
commit 4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b (HEAD -> main)
Author: John Doe <john@example.com>
Date:   Mon Jan 1 12:00:00 2026 +0900

    ユーザー認証機能を追加

    - ログイン機能を実装
    - セッション管理を追加

diff --git a/src/auth.js b/src/auth.js
new file mode 100644
index 0000000..1234567
--- /dev/null
+++ b/src/auth.js
@@ -0,0 +1,20 @@
+function login(username, password) {
+    // 認証処理
+}

特定コミットの表示

1
2
3
4
5
6
7
8
# ハッシュを指定
git show abc1234

# 相対参照を使用
git show HEAD~2

# ブランチの最新コミット
git show feature/login

表示オプション

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 差分なしでメタ情報のみ表示
git show --no-patch

# 統計情報を表示
git show --stat

# 変更ファイル名のみ表示
git show --name-only

# 1行形式で表示
git show --oneline --no-patch

特定ファイルの内容を表示

特定コミット時点でのファイル内容を表示できます。

1
2
3
4
5
6
7
8
# 特定コミットのファイル内容
git show abc1234:src/app.js

# HEADのファイル内容
git show HEAD:src/app.js

# 2つ前のコミット時点のファイル
git show HEAD~2:README.md

タグの内容を表示

1
2
3
4
# タグの詳細を表示
git show v1.0.0

# 注釈付きタグの場合、タグ情報とコミット情報が表示される

出力形式のカスタマイズ

1
2
3
4
5
# カスタムフォーマット
git show --pretty=format:"%h - %s (%an)" --no-patch

# コミットメッセージのみ
git show -s --format=%B

実用的な使用例

1
2
3
4
5
6
7
8
# 最新コミットで変更されたファイル一覧
git show --name-only --oneline

# 過去のバージョンの設定ファイルを確認
git show v1.0.0:config/settings.json

# マージコミットの差分を確認
git show --cc <merge-commit-hash>

git blame - 行ごとの変更者を特定

git blameは、ファイルの各行が最後に変更されたコミットと作成者を表示します。バグの原因調査やコードの経緯を追跡する際に非常に有用です。

基本的な使い方

1
2
3
4
5
6
7
8
9
# ファイルの各行の変更者を表示
git blame src/app.js

# 出力例
4a5b6c7d (John Doe  2026-01-01 12:00:00 +0900  1) function main() {
4a5b6c7d (John Doe  2026-01-01 12:00:00 +0900  2)     console.log("Starting");
1a2b3c4d (Jane Smith 2025-12-31 18:30:00 +0900  3)     initialize();
1a2b3c4d (Jane Smith 2025-12-31 18:30:00 +0900  4)     run();
4a5b6c7d (John Doe  2026-01-01 12:00:00 +0900  5) }

出力の構成は以下のとおりです。

内容
1列目 コミットハッシュ(短縮版)
2列目 作成者名
3列目 日時
4列目 行番号
5列目 ファイル内容

特定行の範囲を表示

1
2
3
4
5
6
7
8
# 10行目から20行目まで
git blame -L 10,20 src/app.js

# 10行目から15行分
git blame -L 10,+15 src/app.js

# 関数名で範囲を指定
git blame -L :functionName src/app.js

表示オプション

1
2
3
4
5
6
7
8
9
# メールアドレスを表示
git blame -e src/app.js

# 日時の表示形式を変更
git blame --date=short src/app.js
git blame --date=relative src/app.js

# コミットハッシュを完全版で表示
git blame -l src/app.js

空白変更の無視

コードのインデント調整などを無視して、実質的な変更者を特定します。

1
2
# 空白の変更を無視
git blame -w src/app.js

行の移動やコピーを検出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ファイル内での行の移動を検出
git blame -M src/app.js

# 他のファイルからのコピーを検出
git blame -C src/app.js

# より積極的なコピー検出
git blame -C -C src/app.js

# すべてのコミットでコピーを検出
git blame -C -C -C src/app.js

特定コミットを無視

リファクタリングやフォーマット変更のコミットを無視して、本質的な変更者を特定します。

1
2
3
4
5
# 特定のコミットを無視
git blame --ignore-rev abc1234 src/app.js

# 複数のコミットを無視(ファイルで指定)
git blame --ignore-revs-file .git-blame-ignore-revs src/app.js

.git-blame-ignore-revsファイルの例:

# フォーマット変更
abc1234567890abcdef1234567890abcdef12345

# ESLint自動修正
def5678901234567890abcdef1234567890abcd

このファイルをリポジトリのデフォルト設定にすることもできます。

1
git config blame.ignoreRevsFile .git-blame-ignore-revs

出力の色分け

1
2
3
4
5
# 同じコミットの行を同じ色で表示
git blame --color-lines src/app.js

# 古い行と新しい行を色で区別
git blame --color-by-age src/app.js

実用的な使用例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# バグがある行の変更者を特定
git blame -L 42,42 src/buggy-file.js

# 特定の関数の変更履歴
git blame -L :login src/auth.js

# フォーマット変更を無視して実質的な変更者を確認
git blame -w --ignore-revs-file .git-blame-ignore-revs src/app.js

# 特定の行がいつ追加されたか調査
git log -S "function login" --oneline

VS Codeとの連携

VS Codeでは、GitLensなどの拡張機能を使用すると、エディタ上で直接blameの情報を確認できます。各行にホバーするだけで変更者と日時が表示され、効率的にコードの履歴を追跡できます。

コマンドの組み合わせ活用

これらのコマンドを組み合わせることで、より高度な調査が可能になります。

バグ調査のワークフロー例

  1. git blameで問題のある行の変更者とコミットを特定
1
git blame -L 100,110 src/problematic-file.js
  1. git showでそのコミットの詳細を確認
1
git show abc1234
  1. git logで関連する変更履歴を調査
1
git log --oneline -10 -- src/problematic-file.js
  1. git diffで変更前後を比較
1
git diff abc1234~1 abc1234 -- src/problematic-file.js

特定機能の実装経緯を調査

1
2
3
4
5
6
7
8
# 機能に関連するコミットを検索
git log -S "featureName" --oneline

# 該当ファイルの変更履歴
git log --oneline --follow -- src/feature.js

# 各コミットの詳細を確認
git show <commit-hash>

まとめ

本記事では、Gitの履歴操作コマンドについて解説しました。

  • git log: コミット履歴の閲覧。--oneline--graph--grepなどのオプションで効率的に検索
  • git diff: 変更内容の比較。作業ツリー、ステージングエリア、コミット間の差分を確認
  • git show: 特定オブジェクトの表示。コミットの詳細や過去のファイル内容を確認
  • git blame: 行ごとの変更者特定。バグ調査やコードの経緯追跡に有用

これらのコマンドを使いこなすことで、「いつ」「誰が」「何を」「なぜ」変更したのかを効率的に調査できるようになります。チーム開発において、コードの履歴を適切に追跡することは、品質の維持と問題解決の迅速化に直結します。

次回は、Gitの変更取り消しコマンド(git restoregit resetgit revert)について解説します。

参考リンク