# 画面設計書 12-GV（Gitログビューア）

## 概要

本ドキュメントは、space-vimにおけるGV（Gitログビューア）画面の設計を記述したものである。gv.vimプラグインによって提供されるGitコミット履歴のグラフィカル表示機能について、その構成・機能・操作方法を詳細に解説する。

### 本画面の処理概要

GV画面は、Gitリポジトリのコミット履歴をグラフィカルに表示し、ブランチの分岐・マージの関係を視覚的に把握できる画面である。コミット一覧から詳細な差分表示への遷移、特定コミット間の比較など、履歴に対する多様な操作を提供する。

**業務上の目的・背景**：ソフトウェア開発において、コミット履歴の確認は日常的な作業である。特にチーム開発では、誰がいつどのような変更を行ったかを把握することが重要となる。GV画面は、ブランチ構造を含むコミット履歴をVim内で視覚的に表示することで、ターミナルでの`git log --graph`よりも直感的な履歴参照を可能にし、コードレビューや変更追跡の効率を向上させる。

**画面へのアクセス方法**：
- `:GV` - 全てのコミット履歴を表示
- `:GV!` - 現在のファイルに関連するコミット履歴のみ表示
- `:GV?` - 現在のファイルに関連するコミットを Location List に表示

**主要な操作・処理内容**：
1. **コミット履歴表示**：ブランチグラフを含むコミット一覧の表示
2. **コミット詳細表示**：選択したコミットの差分・詳細情報の表示
3. **コミット間比較**：ビジュアルモードで2つのコミットを選択して差分を表示
4. **ファイル履歴表示**：特定ファイルに対する変更履歴の絞り込み表示
5. **vim-fugitiveとの連携**：コミット選択からFugitiveの詳細画面への遷移

**画面遷移**：
- エディタ画面 → GV画面（`:GV`コマンド）
- GV画面 → 差分表示画面（コミット選択後Enter）
- GV画面 → エディタ画面（`q`キーで終了）
- GV画面 → Fugitive画面（各種Fugitiveコマンド連携）

**権限による表示制御**：本画面に権限による表示制御は存在しない。Gitリポジトリの参照権限に依存する。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 40 | gv.vim連携 | 主機能 | Gitコミット履歴のグラフィカル表示 |
| 38 | vim-fugitive連携 | 補助機能 | vim-fugitiveとの連携によるコミット詳細表示 |

## 画面種別

一覧画面（コミット履歴一覧）

## URL/ルーティング

Vimコマンドによるアクセス：
- `:GV` - 全コミット履歴表示
- `:GV!` - 現在ファイルの履歴表示
- `:GV?` - 現在ファイルの履歴をLocation List表示

## 入出力項目

| 項目名 | 入出力 | データ型 | 説明 |
|--------|--------|----------|------|
| ファイルパス | 入力（オプション） | 文字列 | 履歴を表示する対象ファイル |
| コミット範囲 | 入力（オプション） | 文字列 | 表示するコミット範囲（例: HEAD~10..HEAD） |
| コミット一覧 | 出力 | リスト | コミット履歴のリスト |
| ブランチグラフ | 出力 | テキスト | ブランチの分岐・マージを示すASCII図 |

## 表示項目

### コミット履歴一覧画面

| 表示項目 | データ型 | 説明 |
|----------|----------|------|
| ブランチグラフ | 文字列（ASCII） | ブランチの分岐・マージを示す線図 |
| コミットハッシュ | 文字列（7文字） | コミットの短縮SHA |
| コミットメッセージ | 文字列 | コミットの1行目（タイトル） |
| 作者名 | 文字列 | コミット作者 |
| 日時 | 日時 | コミット日時 |
| ブランチ/タグ | 文字列 | 参照（refs）情報 |

### コミット詳細画面（Enter押下時）

| 表示項目 | データ型 | 説明 |
|----------|----------|------|
| コミット情報 | 文字列 | 完全なコミットハッシュ、作者、日時 |
| コミットメッセージ全文 | 文字列 | コミットメッセージの全体 |
| 差分 | テキスト | コミットで変更されたファイルの差分 |

## イベント仕様

### 1-コミット履歴表示

`:GV`コマンド実行時、Gitリポジトリの全コミット履歴がグラフ形式で表示される。

```
[ユーザー操作] :GV実行
        ↓
[gv.vim] git log --graphを実行
        ↓
[画面表示] コミット一覧をバッファに表示
```

### 2-コミット詳細表示

コミット一覧で特定のコミットにカーソルを合わせてEnterキーを押下すると、そのコミットの詳細と差分が表示される。

```
[ユーザー操作] コミット行でEnter押下
        ↓
[gv.vim] git show <commit-hash>を実行
        ↓
[vim-fugitive] 差分表示バッファを開く
```

### 3-ファイル履歴表示

`:GV!`コマンドで現在編集中のファイルに関連するコミットのみを表示する。

```
[ユーザー操作] :GV!実行
        ↓
[gv.vim] git log -- <current-file>を実行
        ↓
[画面表示] ファイルに関連するコミットのみ表示
```

### 4-コミット間比較（ビジュアルモード）

ビジュアルモードで2つのコミットを選択してEnterを押すと、それらの間の差分が表示される。

```
[ユーザー操作] ビジュアルモードで2コミット選択 → Enter
        ↓
[gv.vim] git diff <commit1>..<commit2>を実行
        ↓
[画面表示] 2つのコミット間の差分を表示
```

## データベース更新仕様

本画面は参照専用であり、Gitリポジトリへの更新は行わない。

### 操作別Gitリポジトリ影響一覧

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| コミット履歴表示 | .git/objects | SELECT | コミットオブジェクトの参照 |
| コミット詳細表示 | .git/objects | SELECT | コミットと差分の参照 |
| ファイル履歴表示 | .git/objects | SELECT | 特定ファイルの履歴参照 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| GV001 | エラー | Not a git repository | Gitリポジトリ外で実行時 |
| GV002 | エラー | fugitive not found | vim-fugitiveが未インストール時 |
| GV003 | 情報 | No commits found | コミット履歴が空の場合 |

## 例外処理

| 例外状態 | 対処 | ユーザーへの通知 |
|---------|------|-----------------|
| Gitリポジトリ外での実行 | コマンドを中断 | エラーメッセージを表示 |
| vim-fugitive未インストール | 機能制限 | 依存プラグイン不足のメッセージ |
| コミット履歴が存在しない | 空のバッファ表示 | 情報メッセージを表示 |

## 備考

- gv.vimはjunegunn氏によって開発されたVim用Gitログビューアプラグインである
- vim-fugitiveへの依存があり、Fugitiveの機能と連携して動作する
- space-vimでは`:GV`および`:GV!`コマンドで遅延読み込みが設定されている
- ブランチグラフはUnicode文字またはASCII文字で描画される

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

まず、gv.vimがどのように登録されているかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+version-control/git/packages.vim` | gv.vimの登録と遅延読み込み設定 |

**読解のコツ**: `{ 'on': ['GV', 'GV!'] }`は、`:GV`または`:GV!`コマンド実行時に初めてプラグインが読み込まれることを示す。

**主要処理フロー**:
1. **1行目**: `MP 'junegunn/gv.vim', { 'on': ['GV', 'GV!'] }` - GVコマンド実行時に遅延読み込み

#### Step 2: vim-fugitiveとの連携を理解する

gv.vimはvim-fugitiveに依存しているため、その連携を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | packages.vim | `layers/+version-control/git/packages.vim` | vim-fugitiveの登録 |
| 2-2 | config.vim | `layers/+version-control/git/config.vim` | Fugitiveのキーバインド設定 |

**主要処理フロー**:
- **4-16行目（config.vim）**: vim-fugitiveの各種コマンドマッピング

#### Step 3: 画面遷移を理解する

画面遷移図から、GV画面の位置づけを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | 画面遷移図.md | `docs/code-to-docs/画面一覧/画面遷移図.md` | GV画面の遷移パターン |

**主要処理フロー**:
- **56行目**: `EDITOR -->|:GV| GV[GV<br/>コミット履歴]` - エディタからGVへの遷移
- **60行目**: `GV -->|コミット選択| GITDIFF` - GVから差分表示への遷移

### プログラム呼び出し階層図

```
:GV コマンド実行
    │
    ├─ gv.vim（プラグイン本体）
    │      │
    │      ├─ git log --graph 実行
    │      │      └─ コミット履歴取得
    │      │
    │      └─ バッファ作成・表示
    │
    └─ vim-fugitive（依存プラグイン）
           │
           └─ コミット詳細表示
                  └─ :Gedit :コミットハッシュ
```

### データフロー図

```
[入力]                    [処理]                         [出力]

:GV ─────────────▶ gv.vim ────────────────▶ コミット履歴画面
                          │
                          ├─▶ git log --graph
                          │
                          └─▶ バッファ生成

:GV! ────────────▶ gv.vim ────────────────▶ ファイル履歴画面
                          │
                          └─▶ git log -- <file>

Enter ───────────▶ gv.vim ────────────────▶ コミット詳細
                          │
                          └─▶ vim-fugitive連携
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+version-control/git/packages.vim` | ソース | gv.vim, vim-fugitiveプラグイン登録 |
| config.vim | `layers/+version-control/git/config.vim` | ソース | Git関連キーバインド設定 |
| 画面遷移図.md | `docs/code-to-docs/画面一覧/画面遷移図.md` | ドキュメント | 画面遷移の定義 |
| 画面一覧.csv | `docs/code-to-docs/画面一覧/画面一覧.csv` | データ | 画面No.12の定義 |
