top | item 47169518

Show HN: Deff – Side-by-side Git diff review in your terminal

119 points| flamestro | 3 days ago |github.com

deff is an interactive Rust TUI for reviewing git diffs side-by-side with syntax highlighting and added/deleted line tinting. It supports keyboard/mouse navigation, vim-style motions, in-diff search (/, n, N), per-file reviewed toggles, and both upstream-based and explicit --base/--head comparisons. It can also include uncommitted + untracked files (--include-uncommitted) so you can review your working tree before committing.

Would love to get some feedback

65 comments

order

llbbdd|3 days ago

I was looking for a good TUI tool for diffs recently, but I'm not sure yet if what I want exists already (and I don't think this tool does it (yet?)). I've been moving my workflow out of VSCode as I'm using TUI-driven coding agents more often lately but one thing I miss from my VSCode/GitHub workflow is the ability to provide a comment on lines or ranges in a diff to provide targeted feedback to the agent. Most diff tools seem to be (rightfully) focused on cleanly visualizing changes and not necessarily iterating on the change.

I admit I haven't looked super hard yet, I settled on configuring git to use delta [0] for now and I'm happy with it, but I'm curious if anyone has a workflow for reviewing/iterating on diffs in the terminal that they'd be willing to share. Also open to being told that I'm lightyears behind and that there's a better mental model for this.

[0] https://github.com/dandavison/delta/

kodomomo|3 days ago

Octo [0] for nvim lets you submit reviews, add comments on ranges, reply to threads, etc.

This in conjunction with gh-dash [1] to launch a review can get you a pretty nice TUI review workflow.

[0] https://github.com/pwntester/octo.nvim

[1] https://github.com/dlvhdr/gh-dash

*Edit: I see you meant providing feedback to an agent, not a PR. Well that's what I get for reading too fast.

agavra|3 days ago

Checkout https://github.com/agavra/tuicr - it's built exactly for this purpose (reviewing code in your terminal and then adding comments and exporting it to an agent to fix).

thamer|3 days ago

I had tried `delta` a few years ago but eventually went with `diff-so-fancy`[1]

The two are kind of similar if I remember correctly, and both offer a lot of config options to change the style and more. I mostly use it for diffs involving long lines since it highlights changes within a line, which makes it easier to spot such edits.

I have an alias set in `~/.gitconfig` to pipe the output of `git diff` (with options) to `diff-so-fancy` with `git diffs`:

    diffs = "!f() { git diff $@ | diff-so-fancy; }; f"

[1] https://github.com/so-fancy/diff-so-fancy

flamestro|3 days ago

I was also searching for some time, but most of them did not have enough context for my workflow tbh. So thats why I decided to make deff. Another good one I liked is vimdiff

mckn1ght|3 days ago

I use delta for quick diffs in a shell (along with the -U0 option on git-diff), but in my claude workflow, i have a 3 pane setup in tmux: :| where the right side is a claude session, the top left is emacs opened to magit, and the bottom left is a shell. Magit makes navigating around a diff pretty easy (as well as all the other git operations), and I can dive into anything and hand edit as well.

jfyne|3 days ago

Not TUI based but I made something called meatcheck. The idea being that the LLM requests a review from the human, you can leave inline comments like a PR review.

Once you submit it outputs to stdout and the agent reads your comments and actions them.

https://github.com/jfyne/meatcheck

k_bx|3 days ago

What I would love to see is "tig" replacement that is:

- even faster, especially if you have couple thousand files and just want to press "u" for some time and see them very quickly all get staged

- has this split-view diff opened for a file

Otherwise tig is one of my favorite tools to quickly commit stuff without too many key presses but with review abilities, i have its "tig status" aliased to "t"

meain|3 days ago

I have been using https://github.com/jeffkaufman/icdiff for the longest time to get side by side diffs.

flamestro|3 days ago

This looks great as well! I personally prefer a bit more context. Thats why I added a bit more of it to deff. It also allows to mark files as reviewed by pressing `r` which is quite handy for my flow.

lf-non|3 days ago

I also use icdiff, but it is good to have the file-awareness for git diff esp. the ability to quickly skip files that I know aren't important.

rileymichael|3 days ago

getting users to adopt a new tool with its own incantations is a tough sell. git supports specifying an external pager so folks can plug in alternatives (such as https://github.com/dandavison/delta) while still using the familiar git frontend

yottamus|3 days ago

    git difftool --tool=vimdiff

jbaber|2 days ago

I wrote a script that takes two git commits and opens all changed files in vimdiff tabs side by side. I find lots of things too hard to see in github gui. It depends one [tpope's vim-fugitive].

[tpope's vim-fugitive]: https://github.com/tpope/vim-fugitive

I'll paste it next time I'm on that machine.

flamestro|3 days ago

I personally find vimdiff a bit harder to navigate for my usecase. The reason is that I am context unaware of the file often in larger projects and wanted something that allows me to check all lines in a touched file. However, I have to admit vimdiff comes quite close to what I need and is a great tool!

metalliqaz|3 days ago

but is it blazingly fast?

teddyh|3 days ago

  emacs --eval='(ediff-files "file1" "file2")'
(The “|” key toggles side-by-side view.)

def13|2 days ago

I’m not really sure what would pull me away for a vim based solution for viewing diffs (current using codediff.nvim). For a git client in general, I use a cli/tui based solution (lazygit or plain git depending on what I need to do) but when it comes to directly manipulating text why would I throw away all the muscle memory and custom configuration of my editor for a comparatively bare bones standalone tui?

suralind|3 days ago

What you want is difftastic. No need to thank me.

raphinou|3 days ago

Looks interesting. I'm currently using https://tuicr.dev/ , of which I like that the first screen it shows is the choice of commit range you want to review. Might be something to consider for deff?

spartanatreyu|3 days ago

You definitely need a gif or apng file showing it's use in the github readme.

And a link to an asciicinema would help a lot too.

---

Also, I'm not sure how useful the side-by-side view is.

The second example (https://github.com/flamestro/deff/blob/main/docs/example_02....) is confusing.

The left side has lines 1365-1371 having the same code as lines 1374-1380 on the right side, yet they're not aligned with each other.

Most diff views would put padding between lines 1364-1365 on the left side so lines 1365-1371 are aligned with 1374-1380 on the right side.

xmorse|2 days ago

Check out Critique too if you are looking for a side by side diffs TUI

It uses opentui, the same framework uses by opencode.

It can also render diffs to images, pdf and html. Very useful for agents to share diffs in remote environments like Openclaw or Kimaki

https://github.com/remorses/critique

toastal|2 days ago

kitty terminal has diff like this builtin https://sw.kovidgoyal.net/kitty/kittens/diff/

I use it with

    darcs diff --diff-command="kitten diff %1 %2"

tmarice|2 days ago

Nice, I did not know about this!

I feel Kitty doesn't get enough love, it's all ghostty this, ghostty that, but Kitty has been my top performing terminal emulator for 10 years now.

agavra|3 days ago

I just built a version of this a month ago that also allows you to add review comments so you can export them back to an Agent to fix: https://github.com/agavra/tuicr

Great work on deff, would love to brainstorm here :)

hatradiowigwam|3 days ago

vimdiff is pretty fast, and is likely installed on your linux system without you realizing it.

flamestro|3 days ago

Its a great tool, but misses some of the context I needed.

insane_dreamer|3 days ago

we need something like this in lazygit -- which is excellent all around but lacking in visual diffing/merging.

What is most useful though is a 3-panel setup, like JetBrains -- still the best git client I have worked with.

lolive|2 days ago

unfortunately for terminal lovers, the best .gitconfig snippet is still this:

  [diff]
    tool = intellij
  [difftool "intellij"]
    cmd = idea diff \"$LOCAL\" \"$REMOTE\"
  [merge]
    tool = intellij
  [mergetool "intellij"]
    cmd = idea merge \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"
    trustExitCode = true

flamestro|3 days ago

What would the third panel contain in this case? Do you mean the setup that IntelliJ has in merge conflicts?

vindin|2 days ago

Learn to read canonical diffs. It is the standard and will get you further than any new tool

tty456|3 days ago

So, basically 'vim -d' in rust? cool

sourcegrift|3 days ago

Does it show moved codeblocks like reviewboard. Is that the second screenshot

ivanjermakov|3 days ago

8 terminal lines are taken by the tool's UI. Could have been 2.

greatgib|3 days ago

It blows my mind that nowadays, some random tools on internet tells you to do "curl -fsSL https://.... | bash" to install some "binary" things and a lot of people will do it without hesitation.

It probably explains why there is so many data leaks recently but it is like we did a 20 years jump back in time in terms of security in just a few years.

flamestro|3 days ago

I get the hesitation :D But the code is open and the install.sh is as minimal as it gets tbh. Still, as said, I get the hesitation. What a time to be alive.

It does not install binaries, it builds the binary by checking out the project basically. You can also do the process manually and use the tool.

pwdisswordfishy|3 days ago

One day folks who live inside commandlines and TUIs all day will realize that there's nothing particular about webapps or the sandboxes that they execute in that requires we build exclusively graphical runtimes around them, instead of taking advantage of the same security and distribution model for programs accessible and usable from within terminal emulator.

jaden|3 days ago

Is it that different from downloading and running a binary?

holoduke|3 days ago

Cowboys rule the internet.

duskdozer|2 days ago

How else are you going to get your openclaw to run blazingly fast??

But seriously, I think there's a bit of overzealousness/misalignment in security lately with a disregard for usability and privacy, making people less tolerant of dealing with inconveniences.

zem|3 days ago

will this play well with jj?

dec0dedab0de|3 days ago

looks pretty good at a glance, though I would like to see three views for handling conflicts. Target on the left, source on the right, and the combined result in the middle.

...I really just like the way the Jetbrains IDEs do it, and I wish there were a TUI version that I could launch automatically from the git cli.