Release Notes
Added
- A commit graph in History, shown by default. Its lanes are laid out as lazygit lays them out
(the layout is ported from lazygit, MIT): ● for a commit, ◉ for a merge and ◎ for the
checked-out commit. Each branch keeps one theme colour from top to bottom, its labels are pills
in that colour, and the current branch's line is drawn heavy. Each commit keeps its one line from
the list, with a spacer line under it that carries only the branch lines down to the next commit.
history_graph_style = "compact" drops the spacers (one line per commit); any other value than
"spaced" or "compact" warns and keeps "spaced". L shows or hides the graph, and
history_graph = false starts with it hidden. It steps aside during a search, a V range,
compare mode and in a History pane under 34 columns, and cuts lines wider than the pane with ›.
- Conflict help. Conflicted files head the Changes list with their number of blocks; selecting one
shows its blocks as two tinted sides under headers named for the operation (merge: Current /
Incoming; rebase: Base branch / Your commit; cherry-pick: Current branch / Picked commit; revert:
Current branch / Without change). o keeps the first side, t takes the second, b keeps both,
n and p move between blocks, u takes the last resolution back and e opens the editor at
the block. A resolution is written atomically and only over the text that was shown; a block
with ambiguous markers is left to the editor, and conflict-marker-size is honoured. Conflicts
without markers (binary, deleted by one side) are explained and settled whole after asking.
Nothing is staged for you. The marker parser is adapted from druk (MIT).
- A merge, rebase, cherry-pick or revert that stopped (in gitty or in another terminal) shows in the
top bar with its conflict count (MERGING topic · 2 conflicts, REBASING feat · step 2/5 · 1 conflict). m continues it once nothing conflicts (no editor; the prepared message is used) or
aborts it after asking.
- A merge or pull (merge or rebase) that hits conflicts is left open and asks "Resolve now?":
Enter goes to the first conflicted file, a aborts, Esc decides later (m opens the dialog).
- A branch picker (
B): Enter switches (a remote-only branch gets a local tracking branch),
Ctrl-N creates, Ctrl-R renames, Ctrl-D deletes (asking twice when the branch has commits
its upstream lacks, or HEAD without an upstream, as git judges it) and Ctrl-G merges the
highlighted branch into the checked-out one after asking. With uncommitted changes, switching
offers "stash and switch" and merging "stash and merge". After a switch the changes are put back;
after a conflicted merge they stay in the stash until you finish it (aborting from gitty puts
them back). gitty never re-applies a stash by itself otherwise.
- A stash list (
S): a applies, p pops, d drops (asks), n stashes the current changes
under a message; each stash shows its age. Z in the Changes tab stashes with an optional
message. Stashes include untracked files, and the prompts say so (with the count when there are
more than 500).
- A Files tab (
3): the working tree as a lazily loaded tree with a read-only, syntax-coloured
viewer. Changed files show their Changes letter and colour, and folders with changes below them
a ●. i hides or shows ignored files (files_show_ignored sets the start). e or a
double-click opens the file in $EDITOR. Files named like secrets (.env, keys, tokens) are not
read until you press v.
- The top bar shows
PR #<n> when the branch has a GitHub pull request, coloured by its state
(open, draft, merged, closed; themes can set pr_open, pr_draft, pr_merged, pr_closed
under [ui]). Clicking it opens the pull request. It needs the gh CLI logged in, is looked up
in the background (at most every 30 seconds per branch, every 5 minutes while focused), ignores
pull requests from forks, and keeps the last known badge through a failed lookup.
R opens the branch's pull request on GitHub in the browser, or the new-pull-request page when
there is none (or no gh). The branch must be pushed first.
- A push rejected because the remote moved on (after an amend or a rebase) offers a force push with
lease. The question lists the remote commits it would remove; the lease is the commit you last
fetched, so git refuses if anyone pushed since. main, master and the branch origin/HEAD
points to are never force pushed.
- Twelve more built-in themes:
nord, one-dark, one-light, gruvbox-light,
catppuccin-frappe, catppuccin-macchiato, tokyo-night-storm, tokyo-night-day, kanagawa,
everforest-dark, ayu-mirage and nightfox, credited in THIRD-PARTY-LICENSES.md.
- A herdr plugin (
herdr-plugin/) that opens gitty in a popup on the focused
pane's repository, downloading a checksum-verified release binary when none is installed.
Changed
- With the graph shown (the default), History lists commits in topological order (
git rev-list --topo-order) instead of by date; L or history_graph = false brings the date order back. On
a large repository without a commit-graph file the first rows wait for git's sort (about 0.3 s
per 100,000 commits); auto-tune writes that file on repositories with 10,000 commits or more.
- While a conflicted file is selected in Changes,
p and u mean previous conflict and undo the
resolution, not pull and undo the last commit.
Fixed
- Sideways scrolling (
h/l, the sideways wheel, Shift+wheel) in the diff and the Files viewer
only happens when a line is wider than the pane, and stops at the end of the widest line. ‹ and
› mark lines with text hidden on the left or right.
- In compare mode the footer labels
b "other branch" (it picks another branch to compare with)
instead of "branch".
- The footer no longer shows the hints of the pane underneath while a picker, prompt or
confirmation is open.
- Outside a repository gitty prints
gitty: <dir> is not a git repository, without the internal
source path.
Install gitty-cli 0.2.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/VedangP57/gitty/releases/download/v0.2.0/gitty-cli-installer.sh | sh
Install prebuilt binaries via Homebrew
brew install VedangP57/tap/gitty
Download gitty-cli 0.2.0