Answering just the question in the subject line, without addressing anything about git show-branch
(like ElpieKay, I never actually use git show-branch
; it seems mainly mis-informative):
Git branch names—and tag names, and all other reference names, as Git calls them—were originally intended to be case-sensitive.
This all works perfectly on Linux / Unix machines, where Git's code is case-sensitive to start with. When Git stores branch names in the file system as file names (which it only does sometimes), the file system is also case-sensitive.1
It sometimes fails on Windows and some MacOS systems. Specifically, it fails when Git stores references in individual files, whose names are derived from the reference name, and those file names are case-insensitive (e.g., case-preserving, but fold case during name-matching; or even converting everything to uppercase-only, as in the really old FAT 8.3 format, but we can hope no modern file system does this).
As noted above, Git does not always store reference names as file names. In fact, on initial clone, all the names are in a single file called .git/packed-refs
,2 so at this point they are case sensitive. But they become "unpacked" over time,3 and then on some systems they become case-folding.
Because it sometimes fails on some systems, it's generally best to avoid using multiple reference names that differ only in case.
1Of course, on modern Unix/Linux systems, you can now get access to case-preserving-but-case-insensitive file systems, and Windows and MacOS can now be told not to do case-folding for some file systems. (But if you change from the defaults, expect software that is intended for your box to fail, because it will. Things like Photoshop internally try to use files named foo
and FOO
and expect this to refer to the same file!)
2This packed-references file has been around for quite a while, but not forever, and very early versions of Git may not use it. Internally, Git is acquiring a new "pluggable reference name interface" and future versions of Git might use neither this file, nor individual per-reference files.
3In general, creating or updating a reference causes an unpacked reference file to come into existence. Running git pack-refs --all
will replace unpacked references with packed ones, restoring full case-sensitivity. Without --all
, git pack-refs
only packs already-packed references, which is largely a useless mode of operation (it was intended for a case that is no longer used).