Git genealogy, untangled. A TUI for navigating commit graphs with color and clarity. — 771
Find a file
trasta a7785b0896 🔖 Bump version to 0.5.0
Co-Authored-By: Codex <noreply@openai.com>
2026-06-19 22:56:38 +00:00
.agents/skills 🔧 Use shared agent instruction paths 2026-06-19 22:49:40 +00:00
.claude 🔧 Use shared agent instruction paths 2026-06-19 22:49:40 +00:00
.github/workflows ⬆️ Bump GitHub Actions to Node.js 22 versions 2026-03-21 13:31:10 +00:00
docs Add remote branch visibility toggle 2026-06-19 22:29:26 +00:00
src Add remote branch visibility toggle 2026-06-19 22:29:26 +00:00
tests 🐛 Recurse into untracked dirs in working tree status for precise cache key 2026-03-21 10:24:51 +00:00
.gitignore 🐛 Track Cargo.lock for reproducible builds 2026-01-15 06:28:20 +00:00
AGENTS.md 🔧 Use shared agent instruction paths 2026-06-19 22:49:40 +00:00
Cargo.lock 🔖 Bump version to 0.5.0 2026-06-19 22:56:38 +00:00
Cargo.toml 🔖 Bump version to 0.5.0 2026-06-19 22:56:38 +00:00
CLAUDE.md 🔧 Use shared agent instruction paths 2026-06-19 22:49:40 +00:00
cliff.toml 🔧 Improve git-cliff config for PR-based changelog 2026-01-15 07:14:18 +00:00
LICENSE 📄 Update copyright year to 2025 2025-12-21 03:14:10 +09:00
README.md Add remote branch visibility toggle 2026-06-19 22:29:26 +00:00

🧬 keifu

Crate Status Built With Ratatui

日本語版はこちら

keifu (系譜, /keːɸɯ/) is a terminal UI tool that visualizes Git commit graphs. It shows a colored commit graph, commit details, and a summary of changed files, and lets you perform everyday Git operations: branch switching, staging, committing, and pushing — with full mouse support.

Screenshot

Motivation

  • Readable commit graphgit log --graph is hard to read; keifu renders a cleaner, color-coded graph
  • Fast branch switching — With the rise of vibe coding, working on multiple branches in parallel has become common. keifu makes branch switching quick and visual
  • Keep it simple — Only basic Git operations are supported; this is not a full-featured Git client
  • Narrow terminal friendly — Works well in split panes and small windows
  • No image protocol required — Works on any terminal with Unicode support

Features

  • Unicode commit graph with per-branch colors
  • Commit list with branch labels, date, author, short hash, and message (some fields may be hidden on narrow terminals)
  • Commit detail panel with full message and changed file stats (+/-)
  • File diff view with syntax highlighting and word-level change emphasis
  • Git operations: checkout, create/delete branch, fetch, stage/unstage, commit, push
  • Mouse support: click to select commits/files/panes, clickable status bar hints, per-pane wheel scrolling
  • Branch search with dropdown UI
  • Remote-control debug server and file logging for agent-driven debugging (see docs/debugging.md)

Requirements

  • Run inside a Git repository (auto-discovery from current directory)
  • A terminal with Unicode line drawing support and color
  • git command in PATH (required for fetch/push)
  • Rust toolchain (for building from source)

Installation

From crates.io

cargo install keifu

With mise

mise use -g github:trasta298/keifu@latest

With Homebrew

brew install trasta298/tap/keifu

From source

git clone https://github.com/trasta298/keifu && cd keifu && cargo install --path .

Usage

Run inside a Git repository:

keifu

Configuration

See docs/configuration.md for configuration options.

Keybindings

Navigation

Key Action
j / Move down (scrolls the detail pane when focused)
k / Move up (scrolls the detail pane when focused)
Tab Switch pane focus (graph / commit detail)
] Jump to next commit that has branch labels
[ Jump to previous commit that has branch labels
h / Select left branch (same commit)
l / Select right branch (same commit)
Ctrl+d Page down
Ctrl+u Page up
g / Home Go to top
G / End Go to bottom
@ Jump to HEAD (current branch)
Space Open file diff view

Git operations

Key Action
Enter Checkout selected branch/commit
b Create branch at selected commit
d Delete branch (local, non-HEAD)
f Fetch from origin
c Commit staged changes (opens message dialog)
p Push current branch to origin

File list (Space) / staging

Staging keys work when the "uncommitted changes" row is selected.

Key Action
j / k Select file
Enter Open file diff
s Stage / unstage selected file
a Stage all changes
u Unstage all changes
c Commit staged changes
Esc / q Back

Mouse

Input Action
Click on a commit row Select commit (double-click opens the file list)
Click on a file row Select file (double-click opens the diff)
Click on a pane Focus the pane
Click on a status bar hint Run that action
Wheel scroll Scrolls the pane under the cursor

Since keifu captures mouse input, use your terminal's modifier for native text selection (usually Shift + drag; Fn + drag on iTerm2).

Note: Ghostty currently fans one wheel notch out into multiple scroll events for mouse-mode apps (ghostty#3955), which can scroll a few extra lines per notch. Lowering mouse-scroll-multiplier in the Ghostty config works around it.

Key Action
/ Search branches (incremental fuzzy search)
/ Ctrl+k Select previous result
/ Ctrl+j Select next result
Enter Jump to selected branch
Esc / Backspace on empty Cancel search

File diff view

Key Action
j / k / / Scroll up/down
h / l / / Scroll left/right
Ctrl+d / Ctrl+u Half-page down/up
Ctrl+f / Ctrl+b Full page down/up
g / G Go to top/bottom
0 Scroll to line start
] / [ Jump to next/previous hunk
n / N Jump to next/previous file
Esc / q Back to file select / close

Other

Key Action
y Copy commit hash to clipboard (OSC 52)
Y Copy branch name to clipboard (OSC 52)
R Refresh repository data
o Toggle remote branches
? Toggle help
q / Esc Quit (returns focus to the graph first when the detail pane is focused)

Notes and limitations

  • The TUI loads up to 500 commits across the visible branches.
  • Merge commits are diffed against the first parent; the initial commit is diffed against an empty tree.
  • Changed files are capped at 50. Binary files are shown without line stats.
  • If there are staged, unstaged, or untracked changes, an "uncommitted changes" row appears at the top.
  • When multiple branches point to the same commit, the label is collapsed to a single name with a +N suffix (e.g., main +2). Use h/l or / to switch between them.
  • Checking out origin/xxx creates or updates a local branch. Upstream is set only when creating a new branch. If the local branch exists but points to a different commit, it is force-updated to match the remote.
  • Remote branches are displayed by default. Press o to hide them; when hidden, commits reachable only from remote branches are excluded from the graph.
  • Delete operations only work with local branches.
  • Fetch and push require the origin remote to be configured. Staging works per file (no hunk-level staging); commits include only staged changes, like plain git commit.

License

MIT