Hey fellow devs! Here’s a small but super useful Git trick for dealing with that annoying branch case sensitivity issue. You know the drill—someone creates feature/UserAuth, but you type feature/userauth. On a case-sensitive OS, Git tells you the branch doesn’t exist. On a case-insensitive OS like Windows or macOS, it’s worse—you switch to the wrong branch without realizing it. Later, you discover both feature/userauth and feature/UserAuth exist on GitHub. Ouch.
This is particularly painful when working with Windows or macOS, where the filesystem is case-insensitive, but Git isn't.
Add in a mix of developers with different habits (some love their CamelCase, others are all-lowercase fans), and you've got yourself a daily annoyance.
The Fix
I wrote a little Git alias that makes checkout case-insensitive. It's basically a smarter version of git checkout that you use as git co. Here's what it does:
$ git co feature/userauth
⚠️ Warning: "feature/userauth" is incorrect. Switching to: "feature/UserAuth"
Switched to branch 'feature/UserAuth'
Nice, right? No more "branch not found" errors just because you got the case wrong!
Important Note ⚠️
This works in:
- Windows Git Bash (tested and used daily)
- Should work in macOS/Linux (though I haven't tested it - let me know if you try!)
But it won't work in:
- Windows CMD
- Windows PowerShell
- Any other Windows terminals
Why? Because it uses Bash commands and parameters. But hey, you're using Git Bash anyway, right? 😉
How to Install
Just run this in Git Bash:
git config --global alias.co '!f() {
# If no args or help flag, show git checkout help
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
git checkout --help;
return;
fi;
# If any flags are present (except -q or --quiet), pass through to regular checkout
if [ $# -gt 1 ] || [[ "$1" == -* && "$1" != "-q" && "$1" != "--quiet" ]]; then
git checkout "$@";
return;
fi;
# Pass through if argument is a commit reference (HEAD, SHA, tag, etc)
if [[ "$1" =~ ^HEAD([~^]|@{)[0-9]*$ ]] || # HEAD~1, HEAD^1, HEAD@{1}
[[ "$1" =~ ^(FETCH_HEAD|ORIG_HEAD|MERGE_HEAD)$ ]] || # Special refs
[[ -f ".git/refs/tags/$1" ]]; then # Tags
git checkout "$@";
return;
fi;
# Fetch and prune to ensure we have latest refs
git fetch --prune --quiet;
# Check both remote and local branches
correct_branch=$(git branch -r | sed "s/^ origin\///" | grep -i "^$1$");
if [ -z "$correct_branch" ]; then
correct_branch=$(git branch | sed "s/^[* ] //" | grep -i "^$1$");
fi;
# If branch found with different case, warn and use correct case
if [ -n "$correct_branch" ] && [ "$1" != "$correct_branch" ]; then
echo "⚠️ Warning: \"$1\" is incorrect. Switching to: \"$correct_branch\"";
git checkout "$correct_branch";
return;
fi;
# Otherwise just pass through to regular checkout
git checkout "$1";
}; f'
What's Cool About It?
- Finds your branch regardless of how you type the case
- Still works normally for everything else (files, creating branches, etc.)
- Shows you the correct branch name when you get the case wrong
- Auto-fetches to make sure it sees all remote branches
The best part? If it doesn't recognize what you're trying to do, it just passes everything to regular git checkout. So it won't break any of your normal Git workflows.
Real World Usage
I use this daily in a Windows-heavy dev team where we have branches like:
feature/UpdateUser
hotfix/FixLoginBug
release/v2.0.0
And now I can type them however I want. Life's too short to remember exact branch capitalization!
Give It a Try!
If you're using Git Bash on Windows and tired of case sensitivity issues, give this a shot. It's one of those small tools that just makes your day a tiny bit better.
And hey, if you try this on macOS or Linux, let me know how it goes! Always curious to hear if these tricks work in other environments.