コンテンツにスキップ

1.4 コミット履歴の読み方と設計

Git の履歴は、チームの 開発記録そのもの です。
きれいな履歴は「何がいつなぜ変わったか」をすぐに追えますし、
逆に散らかった履歴は、バグ調査やレビューの大きな妨げになります。

このセクションでは、コミット履歴を 読む力設計する力 を身につけましょう 📖


Git の各コミットは、以下の情報を持っています。

flowchart TD
    C["📦 コミットオブジェクト"]
    C --> H["ハッシュ値
a1b2c3d4e5f6..."] C --> P["親コミットへのポインタ
(どのコミットの次か)"] C --> T["ツリーオブジェクト
(ファイルのスナップショット)"] C --> A["メタデータ
作者 / 日時 / メッセージ"] style C fill:#FFF3E0,stroke:#FB8C00,color:#E65100 style H fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style P fill:#E8F5E9,stroke:#43A047,color:#1B5E20 style T fill:#F3E5F5,stroke:#8E24AA,color:#4A148C style A fill:#FFF9C4,stroke:#F9A825,color:#F57F17
Terminal window
git log --oneline --graph --all
* f3a1b2c (HEAD -> develop) Merge branch 'feature/signup'
|\
| * d4e5f6a (feature/signup) feat: サインアップフォーム追加
| * b7c8d9e fix: メールバリデーション修正
|/
* a1b2c3d feat: ヘッダーコンポーネント追加
* e4f5g6h (origin/main, main) 初期コミット
記号意味
*コミット
|ブランチの流れ
\ /分岐またはマージ
(HEAD -> develop)現在いるブランチ
(origin/main, main)ブランチポインタの位置
flowchart LR
    HEAD["🎯 HEAD
今いる場所"] HEAD --> B["develop
(ブランチポインタ)"] B --> C1["コミット f3a1b2c"] C1 --> C2["コミット a1b2c3d"] C2 --> C3["コミット e4f5g6h"] style HEAD fill:#FFEBEE,stroke:#E53935,color:#B71C1C style B fill:#E3F2FD,stroke:#1E88E5,color:#0D47A1 style C1 fill:#FFF3E0,stroke:#FB8C00,color:#E65100 style C2 fill:#FFF3E0,stroke:#FB8C00,color:#E65100 style C3 fill:#FFF3E0,stroke:#FB8C00,color:#E65100
用語意味
HEAD「今、自分がどこにいるか」を示すポインタ
ブランチ特定のコミットを指す名前付きポインタ
タグ特定のコミットに付ける固定ラベル(リリース用)

コミットメッセージは 未来のチームメンバー(含む自分) が読むものです。
半年後に「なぜこの変更をしたのか」を知る唯一の手がかりになります。

Conventional Commits は、コミットメッセージに統一的な構造を与えるための規約です。
多くのチームやOSSプロジェクトで採用されています。

<type>(<scope>): <description>
[本文(任意)]
[フッター(任意)]
type用途
feat新機能feat: ユーザー登録機能を追加
fixバグ修正fix: ログイン時のエラーハンドリングを修正
docsドキュメントdocs: README にセットアップ手順を追加
styleフォーマット変更style: インデントをタブからスペースに変更
refactorリファクタリングrefactor: 認証ロジックを共通モジュールに抽出
testテストtest: ログイン機能のユニットテストを追加
choreビルド・ツールchore: ESLint の設定を更新
perfパフォーマンスperf: 画像の遅延読み込みを実装
ciCI/CDci: GitHub Actions のキャッシュ設定を追加

変更の影響範囲を括弧内に書きます。

feat(auth): OAuth2.0 によるログインを追加
fix(api): レスポンスのステータスコードを修正
docs(readme): インストール手順を更新

複雑な変更の場合は、本文で 「なぜ」 を説明し、フッターで関連情報を記載します。

fix(auth): セッションタイムアウト時のリダイレクトを修正
ログアウト後にセッションが切れた状態で操作を続けると
500エラーが発生していた。タイムアウト検知時に
ログインページへリダイレクトするよう変更。
Closes #142
Co-authored-by: Hanako <hanako@example.com>

「1コミット = 1つの論理的な変更」が基本原則です。

✅ 良い粒度❌ 悪い粒度
ログインフォームのHTML追加3日分の作業をまとめてコミット
バリデーション関数の実装関係ない複数の修正を1コミットに
CSSのレイアウト調整ファイル1つの変更を5コミットに分割
flowchart TD
    Q["この変更を一言で説明できる?"]
    Q -- "はい" --> A["✅ 適切な粒度"]
    Q -- "「〇〇と△△と□□を…」" --> B["⚠️ 分割を検討"]
    Q -- "「途中まで」「作業中」" --> C["⚠️ もう少し進めてから
コミットしよう"] style A fill:#E8F5E9,stroke:#43A047,color:#1B5E20 style B fill:#FFF9C4,stroke:#F9A825,color:#F57F17 style C fill:#FFF9C4,stroke:#F9A825,color:#F57F17

知識ポイント
コミットグラフ--oneline --graph --all で俯瞰する
HEAD「今いる場所」を示すポインタ
ブランチコミットを指す移動可能なポインタ
Conventional Commitstype(scope): description の形式
コミット粒度1コミット = 1つの論理的な変更