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
deltaand set it as your pager. - Grab
lazygitfor 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
mergetoolat Neovim (nvimdiffor Diffview). That gives you a fast, discoverable workflow without locking you into a single big “Git GUI.” Happy merging!