diff-so-fancy - Good-lookin' diffs with diff-highlight and more

jopen 4年前


diff-so-fancy builds on the good-lookin' output of git contrib's diff-highlight to upgrade your diffs' appearances.

  • Output will not be in standard patch format, but will be readable.
  • No pesky + or - at line-start, making for easier copy-paste.


git diff vs git diff --color | diff-so-fancy

diff-highlight vs diff-so-fancy


You can do one-off fanciness:

git diff --color | diff-so-fancy

But, you'll probably want to fancify all your diffs. Run this so git diff (and git show) will use it:

git config --global pager.diff "diff-so-fancy | less --tabs=1,5 -RFX"  git config --global pager.show "diff-so-fancy | less --tabs=1,5 -RFX"

However, if you'd prefer to do the fanciness on-demand with git dsf, drop an alias in your ~/.gitconfig:

dsf = "!git diff --color $@ | diff-so-fancy"


For convenience, the recommended installation is via NPM. If you'd prefer, you may choose to do a manual installation instead.

npm install -g diff-so-fancy

This will install and link the diff-so-fancy and diff-highlight scripts.

Install GNU sed

You'll need GNU sed. On Mac, it's easy to install with Homebrew.

brew install gnu-sed

Improved colors for the highlighted bits

diff-highlight has default colors that are arguably a little nasty. They'll work fine, but you can try some fancier colors:

git config --global color.diff-highlight.oldNormal "red bold"  git config --global color.diff-highlight.oldHighlight "red bold 52"  git config --global color.diff-highlight.newNormal "green bold"  git config --global color.diff-highlight.newHighlight "green bold 22"

You may also want to configure general diff colors.

Manual install

If you want, you can choose to install manually:

  1. Grab the two scripts (diff-highlight and diff-so-fancy) via either downloading or cloning the repo.
  2. If you download diff-highlight from the official git repo, give it a chmod +x.
  3. Place them in a location that is in your PATH directly or with symlinks.
  4. Set up the git pager.diff and pager.show configs, as described above.

Note: The diff-highlight dependency is an official git-contrib script, duplicated here for convenience. If you prefer less fancy in your diff, you also use diff-highlight on it's own.


Sometimes you will want to bypass diff-so-fancy. Use --no-pager for that:

git --no-pager diff


diff-so-fancy started as a commit in paulirish's dotfiles, which grew into a standalone script. Later, @stevemao brought it into its own repo (here), and gave it the room to mature. It's quickly grown into a widely collaborative project.


Pull requests quite welcome, along with any feedback or ideas.


# fork and clone the diff-so-fancy repo.  git clone https://github.com/so-fancy/diff-so-fancy/ && cd diff-so-fancy    # test a saved diff against your local version  cat test/fixtures/ls-function.diff  | ./diff-so-fancy    # setup symlinks to use local copy  npm link  cd ~/projects/catfabulator && git diff

Running tests

You'll need to install bats, the Bash automated testing system. It's also available as brew install bats

git submodule update --init  # pull in the assertion library, bats-assert    # Run the test suite once:  bats test    # Run it on every change with `entr`  brew install entr  ls --color=never diff-so-fancy test/*.bats | entr bats test



项目地址: https://github.com/so-fancy/diff-so-fancy