# 🧬 keifu

[![Crate Status](https://img.shields.io/crates/v/keifu.svg)](https://crates.io/crates/keifu)
[![Built With Ratatui](https://img.shields.io/badge/Built_With-Ratatui-000?logo=ratatui&logoColor=fff&labelColor=000&color=fff)](https://ratatui.rs)

[English README](../README.md)

keifu (系譜, /keːɸɯ/) は、ターミナル上で Git のコミットグラフを可視化する TUI ツールです。カラー付きのグラフ、コミット詳細、変更ファイルの要約を表示し、基本的なブランチ操作も行えます。

![スクリーンショット](win_terminal.png)

## 開発動機

- **読みやすいコミットグラフ** — `git log --graph` は読みづらいので、色分けされた見やすいグラフで表示したい
- **素早いブランチ切り替え** — AI コーディングの普及で、並列にブランチを切って作業することが増えた。ブランチ操作を視覚的かつ高速に
- **シンプルに保つ** — 基本的な Git 操作のみをサポートし、多機能な Git クライアントにはしない
- **狭い画面でも快適** — ターミナル分割や小さいウィンドウでも適切に表示
- **Sixel 対応** — Windows Terminal など Sixel 対応ターミナルでも動作

## 特長

- ブランチごとに色分けされた Unicode グラフ表示
- ブランチラベル、日付、著者、短いハッシュ、メッセージを表示（ターミナル幅が狭い場合は一部省略）
- コミット詳細パネル（フルメッセージと変更ファイルの統計）
- Git 操作: checkout、ブランチ作成/削除、fetch
- ドロップダウン UI によるブランチ検索

## 動作要件

- Git リポジトリ内で実行してください（カレントディレクトリから自動検出します）
- Unicode の罫線文字とカラー表示に対応したターミナル
- PATH に `git` コマンド（fetch に必要）
- Rust ツールチェーン（ソースからビルドする場合）

## インストール

### crates.io から

```bash
cargo install keifu
```

### ソースから

```bash
cargo install --path .
```

または:

```bash
cargo build --release
./target/release/keifu
```

## 使い方

Git リポジトリ内で実行します:

```bash
keifu
```

## キーバインド

### ナビゲーション

| キー | 操作 |
| --- | --- |
| `j` / `↓` | 下へ移動 |
| `k` / `↑` | 上へ移動 |
| `]` / `Tab` | ブランチラベルのある次のコミットへジャンプ |
| `[` / `Shift+Tab` | ブランチラベルのある前のコミットへジャンプ |
| `h` / `←` | 左のブランチを選択（同一コミット内） |
| `l` / `→` | 右のブランチを選択（同一コミット内） |
| `Ctrl+d` | ページ下へ移動 |
| `Ctrl+u` | ページ上へ移動 |
| `g` / `Home` | 先頭へ移動 |
| `G` / `End` | 末尾へ移動 |
| `@` | HEAD（現在のブランチ）へジャンプ |

### Git 操作

| キー | 操作 |
| --- | --- |
| `Enter` | 選択中のブランチ/コミットを checkout |
| `b` | 選択中コミットからブランチを作成 |
| `d` | ブランチ削除（ローカル/非 HEAD のみ） |
| `f` | origin から fetch |

### 検索

| キー | 操作 |
| --- | --- |
| `/` | ブランチを検索（インクリメンタル・ファジー検索） |
| `↑` / `Ctrl+k` | 前の検索結果を選択 |
| `↓` / `Ctrl+j` | 次の検索結果を選択 |
| `Enter` | 選択したブランチへジャンプ |
| `Esc` / 空欄で `Backspace` | 検索をキャンセル |

### その他

| キー | 操作 |
| --- | --- |
| `R` | リポジトリ情報を更新 |
| `?` | ヘルプ表示切り替え |
| `q` / `Esc` | 終了 |

## 注意点と制限

- TUI は全ブランチから最大 500 件を表示します。
- マージコミットの差分は最初の親との比較、初期コミットは空ツリーとの差分です。
- 変更ファイル一覧は 50 件までで、バイナリファイルは対象外です。
- ステージ済みまたは未ステージの変更（未追跡ファイルは除く）がある場合、先頭に「uncommitted changes」行が表示されます。
- 同一コミットに複数ブランチがある場合、ラベルは1つに集約され `+N` 表記になります（例: `main +2`）。`h`/`l` または `←`/`→` で切り替え可能です。
- `origin/xxx` を checkout すると、ローカルブランチを作成または更新します。上流の設定は新規作成時のみ行われます。ローカルブランチが別コミットを指している場合は、リモートに合わせて強制的に更新されます。
- リモートブランチは表示されますが、削除操作はローカルブランチのみ対応です。
- fetch には `origin` リモートの設定が必要です。

## ライセンス

MIT
