Improved Git Diffs with Delta, Fzf and a Little Shell Scripting (nickjanetakis.com)

by nickjj 42 comments 175 points
Read article View on HN

42 comments

[−] linsomniac 49d ago
I had been using delta for around a year and liked it, but still found some of the diffs I was looking a bit hard to read. A few weeks ago after a discussion on HN I tried difftastic, and have become a fan. You might want to consider it if you go down this rabbit hole. https://difftastic.wilfred.me.uk/
[−] nh2 48d ago
Still waiting for Delta + Difftastic integration:

https://github.com/dandavison/delta/issues/535

[−] kennykartman 39d ago
Be careful with difftastic, because it has at least one severe bug involving python that has been present for a long time: https://github.com/Wilfred/difftastic/issues/587
[−] nh2 34d ago
Thanks for pointing that out!
[−] TacticalCoder 48d ago

>

https://difftastic.wilfred.me.uk/

ah, it's using tree-sitter to not bother reporting changes that have no effect.

That's very nice!

Now, of course, the biggest issue is that our DVCes still are from the paleolitic era and store source code as non-structured text files instead of trees, so we need to the proper thing "outside" the DVCS (which is using tools like diffstatic / tree-sitter: tools that have seen the light).

It's basically the old "tabs vs space" and "tabs = how many spaces?" and "bracket on the same line or not" discussions all over again. I'm pretty sure I've got comment from 15 years ago saying that in a proper world this shouldn't even be a concern because this should purely be a client-side concern, on the dev's machine. And that the DVCS should have a specific representation, not opened for discussion (a code formatter for example, but ideally just the source code already as a tree). And then no more bitchin' about tabs vs space, about how many spaces is a tab worth, on which line brackets should go, etc.

Don't get me wrong: it's great that people are doing the right thing. But it's still a kludge that's needed because the underlying tool were made by us and for us cavemen and really could have been oh so much better.

[−] skydhash 47d ago
You forgot that while expression can be trees, statements are an ordered set. And most statements fits inside one line. So a diff that relies on lines gives enough information.

Also git can be made to ignore whitespace changes (a source of noise) and can refine a hunk to highlight what has changed. That’s plenty enough for most people.

[−] nchmy 48d ago
Came to say this as well. Started with delta, then found difftastic.

Even better is using it via jjui, a fantastic TUI for jj vcs

[−] TJTorola 48d ago
Came here to say this, difftastic is great as long as you are working in a language where it understands the language tree (most languages). Getting away from diffs being focused on line changes to diffs that understand the actual language makes so much sense once you start to use it.
[−] rs545837 48d ago
We've been building an open source tool called sem (https://github.com/ataraxy-labs/sem) that takes this one level further: entity-level diffs instead of AST-level.

Instead of showing you which syntax nodes changed, it shows you which functions, classes, and methods changed, classifies the change (text-only, syntax, functional), and walks a dependency graph to tell you the blast radius.

The delta + difftastic integration problem in that issue is interesting because sem already has the pieces both sides need, before/after content with full context for every changed entity, plus structured JSON output. The blocker in #535 is that difftastic's JSON doesn't include surrounding context. sem's output includes complete entity bodies by default.

Would love to collaborate on a common interchange format if anyone from the delta or difftastic projects is interested. Entity-level granularity sits naturally above AST-level diffs and below file-level diffs, and having a standard way to represent "what changed and what depends on it" would be useful for the whole ecosystem.

[−] good-idea 48d ago
Related and a step beyond just viewing diffs - has anyone found a good TUI solution for a local equivalent of doing GitHub PR reviews?

I love the simplicity of using existing tools in this post. It would be nice to have something similar that would allow for adding online comment threads on a diff, and output it to a simple markdown file. Of course, I'm thinking about a local agent workflow here.

[−] baumy 48d ago
As someone who's used vim + a shell as my IDE since the start of my time using computers, it's been really awesome (and occasional eye-roll inducing...) watching people discover all these tools now that claude code is sending them into the terminal.

A lot of posts like this are making it to the front page of HN now that new people are exploring this world for the first time. That's great, the more the merrier, but gets a bit frustrating when a post title is written as if it's discovered some new awesome development tool or methodology, and it's just something people have been doing for years or even decades. This post isn't that big of an offender, but I'm thinking more of stuff like this [0] that it reminded me of.

I should try to be less grumpy about it, but I hope people also try to recognize how often these "new" tools they've been discovering have been routinely used long before LLMs. Maybe I'm just hitting my get-off-my-lawn stage, but it's a bit jarring to come to hacker news and see upvoted posts that are just "look, I can color the diffs in my terminal!". I'm glad this person discovered it, but I thought that was table stakes for the community here.

[0] https://x.com/dani_avila7/article/2023151176758268349

[−] diath 48d ago
I had to give up on diff-so-fancy because it would break a lot when used with git diff --patch but this post just reminded me of the issue and it turns out that it has recently been fixed, so I may give it another go.

https://github.com/so-fancy/diff-so-fancy/issues/498

[−] dex01 46d ago
How about using the already provided git provided diff-highlight tool ?

git config core.pager /usr/share/git/diff-highlight/diff-highlight

[−] jeninho 48d ago
Been using delta for a while now, the side by side mode alone was worth the switch. Pair it with fzf and you can browse commits interactively which is a lifesaver on repos with messy history.