Below is a compact “tool‑belt” that developers who live in a terminal (and in Neovim) usually settle on after trying the popular options. Everything listed is free, works cross‑platform and is actively maintained as of mid‑2025.
1 CLI utilities (outside the editor)
Need | Recommended tool | Why it stands out | One‑liner to enable |
---|---|---|---|
Readable, side‑by‑side diffs & blame | delta | Drop‑in replacement for less that adds syntax‑highlighting, hunk headers, code‑aware line wrapping, optional side‑by‑side view that auto‑enables when the terminal is wide enough news.ycombinator.com | git config --global core.pager delta |
AST‑aware “what actually changed” diff | difftastic | Parses code for ~50 langs; superb when whitespace/noise obscures the real change | git config --global diff.external difft |
Interactive staging, merging, branch & stash mgmt | lazygit | ncurses‑style UI; hit e on a conflicted file to open its built‑in 3‑way merge editor github.comwww.reddit.com | just run lazygit in a repo |
Lightweight history browser / partial‑commit helper | tig | Minimal deps; great when you only need log browsing or git add -p workflow | tig status |
Pull‑request workflow | gh (GitHub CLI) | gh pr checkout 123 then use any of the above for review/merge |
Why delta + lazygit is enough for most:
delta
becomes your default pager everywhere (git diff
, git show
, git blame
). When something needs interactive action—stage a hunk, resolve a conflict, squash, etc.—pop into lazygit
, fix it, quit, and you’re back in the shell. It saves hunting for half‑finished merges hidden in .git/MERGE_MSG
.
2 Inside Neovim
Plugin | Primary job | What you get |
---|---|---|
fugitive.vim | Power‑user porcelain | Ultra‑stable, tiny dependencies; :Gwrite to stage, :Gdiffsplit for per‑file diff. Long‑established favourite. www.reddit.com |
neogit | Magit‑style pop‑up UI | Full status buffer with single‑key staging, rebasing, fixups; integrates with Diffview for 3‑way merges. Great if you want the Magit workflow without Emacs. github.com |
gitsigns.nvim | Inline signs & micro‑workflow | Adds ✓ + ✗ in the sign column, jump between hunks, stage/reset current hunk, virtual‑text blame. Perfect for quick touches while editing. github.com |
diffview.nvim | Full‑screen review & conflict UI | Single tabpage cycles through all changed files; 3‑way merge layout is popular for resolving conflicts cleanly. www.reddit.comgithub.com |
Typical Neovim setup snippet (Lazy.nvim style)
lua
{ "tpope/vim-fugitive", "lewis6991/gitsigns.nvim", { "NeogitOrg/neogit", dependencies = { "sindrets/diffview.nvim" } }, }
Then add:
lua
-- Make Neovim the default mergetool vim.fn.system({ "git", "config", "--global", "merge.tool", "nvimdiff", })
Now running git mergetool
opens a 3‑way nvim -d
session with Diffview layouts if you prefer.
3 Choosing what’s “best” for you
If you value … | Pick … |
---|---|
Small footprint, vanilla Git commands | delta + built‑in git add -p /mergetool |
A single TUI that replaces most Git sub‑commands | lazygit |
Magit‑like ergonomics inside Neovim | neogit (+ diffview.nvim ) |
Zero‑distraction signs & hunk actions while coding | gitsigns.nvim |
Long‑term battle‑tested reliability | fugitive.vim |
Because all the tools are simply wrappers around Git’s plumbing, you can mix and match—e.g. let delta
handle every diff/blame, drop to lazygit
only for complex rebases, and rely on gitsigns
in daily editing.
Quick start checklist
- Install
delta
and set it as your pager. - Grab
lazygit
for anything interactive (especially merges). - Inside Neovim, load at least
gitsigns.nvim
(for the sign‑column magic) and eitherfugitive
(classic) orneogit
(Magit‑style). - Point Git’s
mergetool
at Neovim (nvimdiff
or Diffview). That gives you a fast, discoverable workflow without locking you into a single big “Git GUI.” Happy merging!