DenicioCode
DenicioCode

Reputation: 9346

Git branch command behaves like 'less'

When I use the git branch command to list all branches, I see the output of git branch | less.

The command git branch is supposed to show a list of branches, like ls does for files.

This is the output I get:

git branch paging output

How do I get the default behaviour of git branch? What causes the paged output?

My .gitconfig looks like this:

[user]
  email = [email protected]
  name = Dennis H.
[push]
  default = simple
[merge]
   tool = vimdiff
[core]
  editor = nvim
  excludesfile = /Users/dennish/.gitignore_global
[color]
  ui = true
[alias]
  br = branch
  ci = commit -v
  cam = commit -am
  co = checkout
  df = diff
  st = status
  sa = stash
  mt = mergetool
  cp = cherry-pick
  pl = pull --rebase
[difftool "sourcetree"]
  cmd = opendiff \"$LOCAL\" \"$REMOTE\"
[mergetool "sourcetree"]
  cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh 
  \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
  trustExitCode = true

Upvotes: 820

Views: 101013

Answers (11)

not2qubit
not2qubit

Reputation: 17067

There are a lot of answers and git has made many changes. As of today, this is the .gitconfig that works best for me.

# ...
[core]
        editor = nano
        pager = "cat"

[pager]
        branch = false
        log = "less -FRX"

So cat will be used as the pager for everything except for git branch and git log.

Upvotes: 0

Connor
Connor

Reputation: 51

If you want to just see your branches (unformatted) you can pipe git branch to cat with:

git branch | cat

Upvotes: 4

Sake
Sake

Reputation: 4143

This work for me (Powershell under Windows)

$ git branch | echo

Upvotes: -1

Yongwei Wu
Yongwei Wu

Reputation: 5582

The accepted answer seems wrong. There are two problems:

  1. The behaviour is actually different between (default configured) bash and zsh. The ‘problem’ shows up only under zsh.
  2. The suggested solution will make git branch not use a pager always, which will not be desired when there is a lot of output.

The real reason is that bash and zsh have different default definitions about LESS: bash defines nothing, while zsh defines it to -R. When I do unset LESS in zsh, everything goes back to normal....

The -R behaviour may still be desired. In that case, you can add the following instruction to your .zshrc to keep everything working:

export LESS=-FRX

-F ‘causes less to automatically exit if the entire file can be displayed on the first screen’. However, -X needs to be specified simultaneously, otherwise no output will be shown when there is less than a screenful of output.

Upvotes: 109

RaZ
RaZ

Reputation: 1306

This Git behaviour was more and more annoying for me, too. I got my tag list in less when just wanting to list tags for example.

One can control this behaviour also by changing the default Git PAGER to cat instead of less. I'd rather scroll in iTerm than in an editor. I like to use the editor when I want.

So:

git config --global core.pager cat

Upvotes: 74

Zach Schneider
Zach Schneider

Reputation: 14277

As mentioned in comments to Mark Adelsberger's answer, this was a default behavior change introduced in Git 2.16.

You can turn paged output for git branch back off by default with the pager.branch config setting:

git config --global pager.branch false

Upvotes: 1404

Matthieu Moy
Matthieu Moy

Reputation: 16637

As other answers pointed out, Git defaults to piping itself into a pager (less by default) for most commands.

An important point, though, is that when the LESS environment variable is unset, Git sets it to FRX, and the consequence is that the user-visible behavior is the same as if the pager was not used when the command's output is short (i.e. if you have only few branches). See man less:

-F or --quit-if-one-screen
Causes less to automatically exit if the entire file can be displayed on the first screen.

-R or --RAW-CONTROL-CHARS
[...]ANSI "color" escape sequences are output in "raw" form.

-X or --no-init
Disables sending the termcap initialization and deinitialization strings to the terminal. This is sometimes desirable if the deinitialization string does something unnecessary, like clearing the screen.

If you get the behavior you describe, you most likely have $LESS set to something else, and unsetting it (unset LESS) would get rid of the issue while keeping the "pager" behavior for long output. Alternatively, you can activate the behavior for while keeping $LESS as-is by adding this to your .gitconfig file:

[core]
    pager = less -FRX

If you really dislike the pager thing, you can deactivate it globally or on a per-command basis (see other answers).

Upvotes: 119

Mark Adelsberger
Mark Adelsberger

Reputation: 45819

Not to argue semantics, but the behavior you're getting is the default. That's why you get it when you don't ask for something different. By default, branch (and numerous other Git commands) use a pager when sending output to the terminal.

You can override this default by using the --no-pager option:

git --no-pager branch

Or if you redirect the output to a file, Git should detect that it isn't writing to a terminal and so should not use a pager anyway. (On the other hand, that suggests a scripting use case, in which case you should consider using a plumbing command like git for-each-ref in preference to git branch.)

Upvotes: 111

João Tiago
João Tiago

Reputation: 59

Do the following:

[alias]
  br = !git --no-pager branch

Upvotes: 5

Nick
Nick

Reputation: 9896

For those that want to update their ~/.gitconfig to fix this, it would look like this:

[pager]
   branch = false

Upvotes: 16

C-Otto
C-Otto

Reputation: 5853

https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

GIT_PAGER controls the program used to display multi-page output on the command line. If this is unset, PAGER will be used as a fallback.

To solve your issue, you could unset PAGER and GIT_PAGER in your shell.

Upvotes: 0

Related Questions