Subject: Re: Bug: branch checkout is detached if the case doesn't match

From: Ævar Arnfjörð Bjarmason <[email-masked]>
Date: Mon, 21 Jun 2021 00:03:41 +0200

On Sun, Jun 20 2021, Tim Hutt wrote:

> If you try to switch to a branch (e.g. `master`), but get the case wrong, e.g:
>
>     git switch MASTER
>     git checkout MASTER
>     git switch Master
>     git checkout Master
>
> etc. then it autocorrects the case (bad idea but ok), but it also
> enables the `--detach` flag! In other words
>
>     git switch Master
>
> acts like
>
>     git switch -d master
>
> Very unexpected!

This behavior isn't intentionaly, but ultimately isn't with Git, but
with your running of Git on a filesystem that doesn't respect POSIX
semantics.

The default FS on OSX is case insensitive, we store the "master"
reference (unpacked) under that name on the FS, so this is emergent
behavior. Can you reproduce this after a:

    git pack-refs --all

?

Even after that we'll have a .git/HEAD, and I know on OSX e.g. "git log
head...<branch>" unintentionally resolved to "HEAD" too at some point
(probably still).

There's various workarounds in git's code to deal with funny behavior on
OSX, but it's hard to catch them all as it means having to second-guess
standard library calls. I think you're best off creating a
case-sensitive partition on your computer and using git there if you
want to avoid these cases entirely.

> [System Info]
> git version:
> git version 2.32.0
> cpu: x86_64
> no commit associated with this build
> sizeof-long: 8
> sizeof-size_t: 8
> shell-path: /bin/sh
> uname: Darwin 20.4.0 Darwin Kernel Version 20.4.0: Fri Mar  5 01:14:14
> PST 2021; root:xnu-7195.101.1~3/RELEASE_X86_64 x86_64
> compiler info: clang: 12.0.5 (clang-1205.0.22.9)
> libc info: no libc information available
> $SHELL (typically, interactive shell): /bin/zsh
>
> [Enabled Hooks]