How to See the Shape of a Large Git Diff Before Reading Its Lines
Reviewing a big change starts with a question the diff doesn’t answer up front: what’s in here? git diff prints the first file’s first hunk and makes you scroll for the rest. A coding agent asked to review the same change reads all of it in order, and a 190 kB diff fills a good part of its context before it has seen the list of files.
The diff in this example is a real one, Abbreviatory’s own changes from v0.2.0 to v0.3.0: 5,286 lines in 32 files. That release added the MCP server and the HTTP service, so it’s mostly new files with one big rewrite in the middle.

The Outline First
git diff v0.2.0 v0.3.0 | abbreviatory reduce -budget 2000
[abbreviatory] diff, 5,286 lines (190.1 kB), ref 7cbef4a2c990
diff: 32 files changed, +3,877 -663 (14 added)
FILES (32):
- M .github/workflows/test.yml (+8 -1) [ref 7cbef4a2c990:L1-27]
- M CLAUDE.md (+41 -9) [ref 7cbef4a2c990:L28-114]
- M README.md (+75 -4) [ref 7cbef4a2c990:L115-239]
...
- A cmd/abbreviatory/core.go (+694 -0) [ref 7cbef4a2c990:L476-1175]
- M cmd/abbreviatory/main.go (+112 -497) [ref 7cbef4a2c990:L1176-1952]
- A cmd/abbreviatory/mcp.go (+515 -0) [ref 7cbef4a2c990:L1953-2473]
...
not shown: 5 of 32 files [ref 7cbef4a2c990]
not shown: 76 of 76 changes [ref 7cbef4a2c990]
At 2 kB the report is the outline: totals, then every file it has room for, with A for added, M for modified, R old -> new for renamed. The story of the change is already there. main.go lost 497 lines and core.go gained 694: the command line’s logic moved into a core the new servers share. At the default 4 kB the report lists all 32 files and starts on the changes, a few lines of each hunk in turn.
Then One File
Each file’s reference is a range of lines in the diff. To read the core:
abbreviatory expand 7cbef4a2c990:L476-1175
That prints the diff of core.go exactly as git wrote it, headers and all, so it can go straight to git apply or a review tool. An agent does the same with the MCP expand tool: outline first, then only the files it decides to read.
To narrow the diff before reducing it, use git’s own path filters. Leaving out tests and docs here gives 11 files and a report that has room for the first lines of every one of the 33 changes:
git diff v0.2.0 v0.3.0 -- '*.go' ':!*_test.go' | abbreviatory reduce -budget 2500
What It Points Out
Some things in a diff are worth flagging before anyone reads it. Conflict markers left in a file (<<<<<<< and >>>>>>> in added lines) are errors and go to the top of the report. Added lines with trailing whitespace are warnings. A change repeated in several places, a rename done across forty files, is shown once with a count. Lock files, minified code, generated protobuf code and anything under vendor/ or node_modules/ are listed with their counts and not spelled out.
It reads git diff, git show, git log -p with its commits, plain diff -u, diff -r with its “Only in” lines, and the combined diffs git shows for merges. A hunk keeps up to 200 of its changed lines in the report’s detail; the reference always has all of them. The reference lists what it recognises as generated.