git log、show、diffでGitの履歴を表示する


weather-appを月曜日の朝に開いて、金曜日に何をリリースしたのか正確に思い出せないことがあります。あるいはチームメイトが先週の気温変換が変わった理由を聞き、推測ではなく本当の答えが必要な場合もあります。コミットループはコミットがどのように保存されるかを説明しています。この章では、その履歴を逆向きに読むことを扱います。何が起きたか、誰がしたか、いつしたか。そのコマンドはgit logで、小規模なプロジェクトで印字されるすべてをここに示します。
$ git log
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: Taro Yamada <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
セルシウス-ファーレンハイト変換式の温度変換を修正
commit 5f3d8b21a90e7c6d5b4a3f2e1d0c9b8a7f6e5d4c
Author: Hanako Sato <[email protected]m>
Date: Mon Jul 13 16:45:22 2026 +0100
ダッシュボードに5日間予報を追加
commit 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
Author: Hanako Sato <[email protected]m>
Date: Mon Jul 13 11:03:47 2026 +0100
プロジェクト構造を設定1つのコマンドで、プロジェクト全体の物語がそこにあります。3つのコミット、新しい順に、それぞれ誰が書いたか、いつか、そして理由が。
git logでログを読む
git logは現在いる場所から到達可能なすべてのコミットを逆方向に歩みます。最新のものが最初です。各エントリは4つのものを表示します。ハッシュ(そのコミットを識別する長い文字列と数字)、作成者、日付、そしてその作成者が書いたメッセージです。
コミットは、これらの4つのものをまとめたもの。その時点でのすべての追跡ファイルのスナップショット、変更を説明するメッセージ、それを誰が作ったか、そして直前のコミット、その親コミットへのリンク。この親リンクが、個別のスナップショットの集まりを実際のタイムラインに変えます。git logを上から下へ読み、タイムラインを逆向きに読んでいます。現在から始まりまで。
ハッシュは最初は威圧的に見えますが、全体が必要なことはめったにありません。4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3cと4f2a1c9は同じコミットを指します。Gitは、リポジトリ内の他のすべてのコミットと区別するのに十分なハッシュだけが必要で、最初の7文字程度はほぼ常に十分です。このシンプルな形式は、この章の残りのコマンドを含め、あらゆる場所で見かけます。
git logはすべてのコミットを最新順に表示し、ハッシュ、作成者、日付、メッセージを含みます。コミットはそのスナップショットとメッセージと、その前のコミットへのリンクです。完全なハッシュが必要になることはめったになく、最初の数文字でGitは正確にどのコミットを意味するのかを知っています。 git showで1つのコミットを検査する
git logはコミットが起きたことを教えます。git show <hash>はそれが正確に何をしたかを教えます。
$ git show 4f2a1c9
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: Taro Yamada <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
セルシウス-ファーレンハイト変換式の温度変換を修正
diff --git a/src/index.js b/src/index.js
index 3f2c1a9..7b8e2d4 100644
--- a/src/index.js
+++ b/src/index.js
@@ -12,7 +12,7 @@ function celsiusToFahrenheit(celsius) {
- return celsius * (9 / 5 + 32)
+ return (celsius * 9) / 5 + 32上部はgit logが表示するのと同じメタデータです。その下は実際の変更。-で始まる行はコミットが削除した行、+で始まる行はそれが追加した行、マークされていない行は同じままのコンテキストです。ここではっきり読めます。古い行は32を括弧の中でグループ化しているため、乗算の前に追加されていました。修正は括弧をcelsius * 9の周りに再グループ化して、32が最後に追加されるようにします。Taroのメッセージがについて説明する演算子優先度のバグです。
git show <hash>は1つのコミットを完全に表示します。誰がそれを作ったか、いつ、そして変更した実際の行。削除された行はマイナス記号で始まり、追加された行はプラス記号で始まります。「このコミットは実際に何をしたか」という質問に答える最速の方法です。 git diffが表示するもの、そしてほぼ全員がぶつかる勘違い
git logとgit showはコミットされた履歴を読みます。git diffはまだコミットされていないもの、つまり今のワーキングディレクトリにある変更を読みます。これを最後のコミットと比較します。
$ git diff
diff --git a/README.md b/README.md
index 1c2d3e4..9f8a7b6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# weather-app
+Vanilla JavaScriptで構築された5日間の天気ダッシュボード。これはREADME.mdへの編集で、ステージまたはコミットする前に示されています。ここが最初の1週間でほぼ全員を捕まえる部分。git add .を実行してその変更をステージし、その後git diffを再度実行すると、まったく何も表示されません。
$ git add .
$ git diff何も印字されていません。編集は消えていません、何も間違っていません。平文のgit diffはワーキングディレクトリとステージングエリアを比較しており、すべてをステージしたら、その2つは今一致しているため、そこに左に表示される差分は残りません。ステージングエリアで待機中の変更を見るには、代わりにgit diff --stagedを使用します。
$ git diff --staged
diff --git a/README.md b/README.md
index 1c2d3e4..9f8a7b6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# weather-app
+Vanilla JavaScriptで構築された5日間の天気ダッシュボード。同じ変更、今見えます。なぜなら--stagedはステージングエリアを最後のコミットと比較しているからです。
git diffはまだステージされていないワーキングディレクトリ内の編集を表示します。git addですべてをステージすると、平文のgit diffは静かになります。これは期待されています。変更はまだそこにあります。git diff --stagedを使用して、コミットされるのを待っているものを見ます。 なぜGit履歴がグラフを形成するのか
これまで見たすべてのコミットは正確に1つの親を指し、git logを上から下へ読むことは直線を読むように感じています。これはソロプロジェクトで1行の作業をしている限り保ちます。ブランチとマージが登場し、次のブランチでカバーされます。プロジェクトの実際の履歴は分割されて別の行に分け、一緒に戻すことができるからです。

