5 中級 約 25 分

コミット履歴と差分調査

git log・git diff・git show・git bisect を使って、過去のコミット履歴や変更内容を調査する方法を演習問題で学びます。

このチュートリアルでは、「過去に何が起きたか」を調べるためのコマンド群を演習形式で学びます。バグ調査やコードレビューなど、実務で頻繁に使う調査系コマンドの使い分けを身につけましょう。

前提: いくつかコミットが積まれたリポジトリがあることを前提とします。


演習 1:git log のフォーマットを使いこなす

デフォルトの git log は情報量が多く、ブランチ構造を俯瞰しづらいことがあります。

問題: すべてのブランチのコミットを、1行1コミットのグラフ形式で表示するコマンドを書いてください。

答えを見る
git log --oneline --graph --decorate --all

出力例:

* a1b2c3d (HEAD -> main, origin/main) ログイン機能を追加
| * f9e8d7c (feature/signup) 新規登録画面を追加
|/
* e4f5g6h READMEを更新
* 1234abc 初回コミット
オプション効果
--oneline1コミットを1行に短縮表示
--graphブランチの分岐・マージをASCIIグラフで表示
--decorateブランチ名・タグ名を表示
--allすべてのブランチを対象にする(デフォルトは現在のブランチのみ)

この組み合わせは非常によく使われるため、git config --global alias.graph "log --oneline --graph --decorate --all" のように alias 登録しておくと便利です。


演習 2:ファイルの変更前後を比較する(git diff)

問題: 作業ツリーで編集中(まだ git add していない)の app.js について、直前のコミットとの差分を表示するコマンドを書いてください。

答えを見る
git diff app.js

出力例:

diff --git a/app.js b/app.js
index 1234abc..f9e8d7c 100644
--- a/app.js
+++ b/app.js
@@ -1,3 +1,4 @@
 function login(user) {
+  if (!user) return false;
   return true;
 }

- で始まる行が削除された内容、+ で始まる行が追加された内容です。引数なしの git diff は「作業ツリー」と「ステージングエリア(またはHEAD)」の差分を表示します。


演習 3:ステージングと HEAD の差分を見る(git diff —staged)

問題: app.jsgit add した後、その内容が直前のコミット(HEAD)とどう違うかを確認するコマンドを書いてください。

答えを見る
git diff --staged

--cached でも同じ結果になります)

コマンド比較対象
git diff作業ツリー ⇔ ステージングエリア
git diff --stagedステージングエリア ⇔ 直前のコミット(HEAD)
git diff HEAD作業ツリー ⇔ 直前のコミット(ステージング状態を問わない全変更)

コミット前に「これから何をコミットするか」を最終確認する際に git diff --staged を使うと安全です。


演習 4:特定コミットの内容を確認する(git show)

問題: コミットハッシュ a1b2c3d の変更内容(コミットメッセージ+差分)を表示するコマンドと、そのコミットで変更されたファイル名だけを確認するコマンドをそれぞれ書いてください。

答えを見る
# コミットメッセージと差分の全文を表示
git show a1b2c3d

# 変更されたファイル名だけを表示
git show --name-only a1b2c3d

出力例(--name-only):

commit a1b2c3d4e5f6789...
Author: Taro Yamada <taro@example.com>
Date:   Thu Jun 12 14:30:00 2025 +0900

    ログイン機能を追加

app.js
tests/app.test.js

git log で対象のコミットを見つけ、git show でその詳細を掘り下げる、という組み合わせがよく使われます。


演習 5:バグ混入コミットを二分探索で特定する(git bisect)

現在のコードにバグがあり、以前のバージョン(タグ v1.0.0)では正常だったことがわかっているとします。

問題: git bisect を使って、v1.0.0 から現在(HEAD)までの間でバグが混入したコミットを特定する手順(コマンド列)を書いてください。

答えを見る
# bisect セッションを開始
git bisect start

# 現在のコミットにバグがあることを報告
git bisect bad

# バグがなかった地点を報告
git bisect good v1.0.0

Git が自動的に中間のコミットへ移動するので、その都度動作確認して結果を報告します。

# 動作確認した結果に応じて
git bisect good   # バグがなければ
git bisect bad    # バグがあれば

これを繰り返すと <hash> is the first bad commit という形で原因コミットが表示されます。確認が終わったら、必ずセッションを終了します。

git bisect reset

テストコマンドが用意されている場合は、git bisect run npm test のように自動化することもできます。


まとめ

調査目的別のコマンドの使い分けを整理します。

複数コミットの流れを俯瞰したい     → git log --oneline --graph --decorate --all
今の変更内容を確認したい          → git diff / git diff --staged
特定の1コミットの詳細を見たい      → git show <hash>
バグ混入コミットを特定したい       → git bisect

「まず git log で全体像を掴み、怪しいコミットを git show で深掘りし、原因不明なら git bisect で絞り込む」という流れを覚えておくと、調査がスムーズに進みます。