:GG~ .?Y.
.... .. .. ..... . ^BG: .. .....
.7555YY7JP^ ~PJ ~PJ ?YY5PP~ 7YY5BGYYYYJ. J555YY557.
.5B?. :JBB~ !#5 !#5 ...PB~ ...^BG:.... ~:. .7#5 :^^
7#5 .GB~ !B5 !B5 PB~ :BG. .~7??J?JBG: .~JPPPY
?#Y PB~ !B5 !B5 PB~ :BG. 7GP7~^^^!BG: ~5GY!:.
^GB~ 7BB~ ^BG. .YB5 5#7 :BB: P#! JBG: ^GG7
^5G5JJYJPB~ JBP???YYB5 ^5GYJJ?. 7GPJ???. ~PGJ77?5J5B! JG5
.^~^..GB: :~!!~. ^^ :~~~~ .^~~~~ .^!!!~. .^: JG5
.?!^^^!5G7 YB5
.!?JJJ?!: 75?
terminal based cross-platform git client
made with ♡
guita╭, distributed as guitar, is a Rust terminal UI for working with Git history from a topology-first point of view. It is built with ratatui, crossterm, and libgit2, and is designed for exploring, filtering, and operating on large repositories without leaving the terminal.
guita╭ lets you instantly travel to prehistoric times in BIG repositores (500k+ commits)
This is a hobby project with sharp Git tools. It can stage, unstage, commit, force checkout, force push, delete branches, reset, stash, pop, drop, rebase, merge, cherry-pick, revert, prune worktrees, update submodules, sync submodule URLs, and discard file changes.
Use it carefully on important repositories. Keep backups, understand what the selected row and focused pane mean before using action mode, and report issues when behavior is surprising.
the complete rundown of features of the v1.0.0:
https://m.youtube.com/watch?v=0oyqviuKFXI
Older recording of the v0.1.12 feature set and some technical breakdown of the core walker:
https://www.youtube.com/watch?v=oERA8MYlHjQ
The recording is still useful as a tour. This README and the in-app settings/help view are the current source of truth for shortcuts and behavior.
user.name and user.email configured in Git before opening a repository. guitar reads these on repository load and uses them when creating commits.Set identity globally:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Or set identity per repository:
git config user.name "Your Name"
git config user.email "you@example.com"
Prebuilt binaries are published on the releases page:
Important! Im not bothering myself with config migrations. So if you are trying out a new version, make sure to run guitar --reset. You might want to backup your .config/guitar folder before doing so. This is a temporary measure because im lazy.
https://github.com/asinglebit/guitar/releases
Build from source:
git clone https://github.com/asinglebit/guitar.git
cd guitar
cargo build --release
The release binary is written to:
target/release/guitar
Run from inside a repository, a repository subdirectory, or with an explicit path:
guitar
guitar ../path/to/repository
The first non-flag argument is treated as the repository path. If no path is provided, . is used. The path is canonicalized and then resolved to the Git repository root when possible.
Meta flags:
guitar --version
guitar -v
guitar --reset
--version and -v print the version and exit. --reset deletes the saved guitar config directory, then starts the app with regenerated defaults.
If the path cannot be opened as a Git repository, guitar falls back to the splash screen and shows saved recent repositories.
guitar is built around a few core ideas:
0 is a synthetic uncommitted-work row above HEAD. It represents staged files, unstaged files, and conflicts in the working tree.h widens outward, l narrows inward.Ctrl+a, then the action key.The splash screen appears when no repository is open or when you back out of the graph. It lists recent repositories from recent.json.
Enter or l opens the selected recent repository.d removes the selected recent repository from recent.json.Shift+K and Shift+J move the selected recent repository up or down.Esc returns to the graph when a repository is already loaded.q exits.The graph is the central history view. It can render:
Graph row details are loaded by window, so large repositories can stay responsive.
The branch pane lists local branches first and remote branches after them, sorted by name inside each group.
Branch visibility affects graph roots and filtering. Branches are visible by default unless their exact local or remote name is saved in the hidden-branch layer. Hidden branch names are saved per repository, pruned when refs disappear, and new branches are visible until explicitly hidden.
The tag pane lists local tags sorted by name. Tags are shown in the graph at the commit they resolve to. The app can create and delete local lightweight tags.
The stash pane lists stash commits. Stashes are real commits and are rendered in the graph near their first parent.
The reflog pane lists recent HEAD reflog entries. Reflog rows can jump to commits that are visible in the graph. If the reflog commit is hidden, enable graph reflogs with ) so the walker includes HEAD reflog roots.
The worktree pane lists the main worktree and linked worktrees.
Rows include:
Valid worktrees can be opened from the pane. Linked worktrees can be locked, unlocked, removed, or pruned through the worktree actions.
The submodule pane lists immediate Git submodules for the current repository.
Rows include:
Initialized submodules can be opened from the pane, which reloads guitar at the submodule repository path. Opened submodules are tracked in a session-only stack, rendered in the left status bar as a ▣ breadcrumb before the current branch or HEAD. Uninitialized submodules can be updated and initialized through the submodule action.
The status area is on the right.
On the uncommitted row:
On a commit row:
Status symbols:
! conflict.~ modified.+ added.- deleted.→ renamed.The inspector shows selected commit metadata:
When the selected row is uncommitted, the inspector appears if there are conflicts.
The viewer opens from a selected status row. It can show:
For merge commits, file lists and file diffs compare against the first parent.
The settings/help view is opened with ?. It shows version and the commit heatmap above tabbed settings sections for general, display, auth, repo, and shortcuts. Recent repository rows, performance rows, remote rows, theme rows, layout rows, and keybinding rows are selectable.
h and l are the most important navigation keys.
l narrows into details. On a commit row it focuses the inspector; on the uncommitted row it focuses staged or unstaged status.l moves to status.l opens the selected file in the viewer.h returns to status.h moves outward to inspector or graph.h opens/focuses the branch pane.l jumps into the selected item.h returns to the graph.l opens the selected recent repository.Tab and Ctrl+n move to the next focusable pane. Shift+Tab and Ctrl+p move to the previous focusable pane.
Ctrl+h, Ctrl+j, Ctrl+k, and Ctrl+l move focus to the nearest pane in that direction when one is visible. Ctrl+Left, Ctrl+Down, Ctrl+Up, and Ctrl+Right are equivalent arrow-key alternatives.
Focusable panes are ordered:
graph/viewer, inspector, staged/commit status, unstaged status, search, submodules, worktrees, reflogs, stashes, tags, branches
Hidden panes are skipped. The unstaged status pane is focusable only on the uncommitted row.
Enter means "open/select" for the current focus:
- and + shrink or grow the graph lane limit by one.Esc cancels modals or widens back to the graph.
All scroll commands act on the focused pane or viewport:
j / Down: one row down.k / Up: one row up.Ctrl+d: half page down.Ctrl+u: half page up.PageDown: page down.PageUp: page up.Ctrl+Alt+d: jump halfway toward the end of the focused graph/side pane list.Ctrl+Alt+u: jump halfway toward the beginning of the focused graph/side pane list.g / Home: beginning.Shift+G / End: end.In full viewer mode, Ctrl+d and Ctrl+u jump between diff hunk edges. In hunk and split viewer modes, they scroll by half pages.
Ctrl+Alt+h, Ctrl+Alt+j, Ctrl+Alt+k, and Ctrl+Alt+l resize the focused pane one cell or row at a time. Ctrl+Alt+Left, Ctrl+Alt+Down, Ctrl+Alt+Up, and Ctrl+Alt+Right are equivalent arrow-key alternatives.
Ctrl+Alt+l widens the left column; Ctrl+Alt+h narrows it.Ctrl+Alt+h widens the right column; Ctrl+Alt+l narrows it.Ctrl+Alt+h grows the cente$ claude mcp add guitar \
-- python -m otcore.mcp_server <graph>