so-fancy/diff-so-fancy
{ "createdAt": "2016-02-04T11:32:08Z", "defaultBranch": "next", "description": "Good-lookin' diffs. Actually… nah… The best-lookin' diffs. :tada:", "fullName": "so-fancy/diff-so-fancy", "homepage": "", "language": "Perl", "name": "diff-so-fancy", "pushedAt": "2025-07-15T18:09:50Z", "stargazersCount": 17863, "topics": [ "diff", "diff-highlight", "diffs", "fancy", "git", "hacktoberfest" ], "updatedAt": "2025-11-27T00:31:16Z", "url": "https://github.com/so-fancy/diff-so-fancy"}🎩 diff-so-fancy

Section titled “🎩 diff-so-fancy ”diff-so-fancy strives to make your diffs human readable instead of machine readable. This helps improve code quality and helps you spot defects faster.
🖼️ Screenshot
Section titled “🖼️ Screenshot”Vanilla git diff vs git and diff-so-fancy
![diff-highlight vs diff-so-fancy]!(diff-so-fancy.png)
📦 Install
Section titled “📦 Install”Simply copy the diff-so-fancy script from the latest release into your $PATH and you’re done. Alternately to test development features you can clone this repo and then put the diff-so-fancy script (symlink will work) into your $PATH. The lib/ directory will need to be kept relative to the core script.
diff-so-fancy is also available from the NPM registry, brew, Fedora, in the Arch extra repo, and as ppa:aos for Debian/Ubuntu Linux.
Issues relating to packaging (“installation does not work”, “version is out of date”, etc.) should be directed to those packages’ repositories/issue trackers where applicable.
✨ Usage
Section titled “✨ Usage”With git
Section titled “With git”Configure git to use diff-so-fancy for all diff output:
git config --global core.pager "diff-so-fancy | less --tabs=4 -RF"git config --global interactive.diffFilter "diff-so-fancy --patch"Manually with diff
Section titled “Manually with diff”Use -u with diff for unified output, and pipe the output to diff-so-fancy:
diff -u file_a file_b | diff-so-fancyIt also supports the recursive mode of diff with -r or --recursive as first argument
diff -r -u folder_a folder_b | diff-so-fancydiff --recursive -u folder_a folder_b | diff-so-fancy⚒️ Options
Section titled “⚒️ Options”markEmptyLines
Section titled “markEmptyLines”Should the first block of an empty line be colored. (Default: true)
git config --bool --global diff-so-fancy.markEmptyLines falsechangeHunkIndicators
Section titled “changeHunkIndicators”Simplify git header chunks to a more human readable format. (Default: true)
git config --bool --global diff-so-fancy.changeHunkIndicators falsestripLeadingSymbols
Section titled “stripLeadingSymbols”Should the pesky + or - at line-start be removed. (Default: true)
git config --bool --global diff-so-fancy.stripLeadingSymbols falseuseUnicodeRuler
Section titled “useUnicodeRuler”By default, the separator for the file header uses Unicode line-drawing characters. If this is causing output errors on your terminal, set this to false to use ASCII characters instead. (Default: true)
git config --bool --global diff-so-fancy.useUnicodeRuler falserulerWidth
Section titled “rulerWidth”By default, the separator for the file header spans the full width of the terminal. Use this setting to set the width of the file header manually.
git config --global diff-so-fancy.rulerWidth 80👨 The diff-so-fancy team
Section titled “👨 The diff-so-fancy team”| Person | Role |
|---|---|
| @scottchiefbaker | Project lead |
| @OJFord | Bug triage |
| @GenieTim | Travis OSX fixes |
| @AOS | Debian packager |
| @Stevemao/@Paul Irish | NPM release team |
🧬 Contributing
Section titled “🧬 Contributing”Pull requests are quite welcome, and should target the next branch. We are also looking for any feedback or ideas on how to make diff-so-fancy even fancier.
Other documentation
Section titled “Other documentation”- [Pro-tips on advanced usage]!(pro-tips.md)
- [Reporting Bugs]!(reporting-bugs.md)
- [Hacking and Testing]!(hacking-and-testing.md)
- [History]!(history.md)
🔃 Alternatives
Section titled “🔃 Alternatives”- Delta
- Lazygit with diff-so-fancy integration
🏛️ License
Section titled “🏛️ License”MIT