Why does a pipe remove the branch names from git log?

The git log command is what Git calls porcelain. This means it is meant to be used by actual humans, as opposed to other Git commands like git rev-parse and git for-each-ref that are mostly or entirely meant for computer programs to run.

Porcelain commands are usually configurable, and often do things like color or paginate their output. This is true for git log as well. Several of the controls for this are git config entries:

color.ui = auto
log.decorate = auto

This auto setting, which is the default—you can change it to always or never—tells Git: When the command writes its output to a terminal, do it, but when it does not (like when it writes to a pipe as in git branch | grep ...), don't do it.

The log.decorate option controls the (master) decorations. Whether particular text is colored, and if so, with which colors, is controlled by a rather complicated maze of options that merely starts with color.ui.

Setting color.ui to always will break naive scripts that run porcelain commands in pipelines and expect color.ui to be set to its default auto. None of Git's own scripts are naive like this, but you may be using your own extensions, or ones obtained from people who didn't think about the issue, so be careful when overriding these defaults.

(By the way, be careful about the = in settings. These are required inside .git/config and git -c color.ui=true log, for instance, but forbidden in git config log.decorate auto. It's a crazy mishmash of historical artifacts and coding whatever was expedient at the time.)


For start, I too had noticed the lack of colors after a pipe to bash, but what you describe about decorations (branch and tag names) disappearing is odd. Let's adress them separately.

Adressing the branch names (decorations) themselves

--decorate

is the flag for that, for a one-shot use.

For the permanent effect, you can set it in your config

log.decorate true

And for a more specific need, note you can use it in a pretty format, with the placeholder %d, for example :

git log -10 --pretty=format:"%C(yellow)%h %C(reset)%aN %ar %C(red)%d %C(reset)%s"

for a result that looks like this

enter image description here

About colors

No, I don't know how / why it breaks when it's passed to bash, I'll let more advanced users answer that part. (and as I said, on a personal note I'm very glad you asked this question because I'm eager to know that too - Edit : thanks torek! :-) )