This is because git displays it through a pager.
git --no-pager diff
It is configured to use the default pager configuration, you can change this default to use cat instead, so you don't have to type --no-pager using git config --global core.pager cat . Read more about the documents here .
The output to STDOUT and through the pager is much more complicated and requires tools that go beyond the regular redirection of unix and pipes. You can redirect the output to STDERR with tee , and pipe to less , which gives you the illusion. Note that this is a hack and abuses the idea of STDERR
git diff | tee /dev/stderr | less
You can make it an alias if you plan to use it often.
source share