Using Git switch to change branches
First posted 12th April 2021 in Development and Git; updated 13th April 2021
Since upgrading to macOS Big Sur and its version of Xcode Command Line Tools, I’ve noticed that git switch now works.
git checkout has always been a funny one for me; it switches branches, allows you to view code at older commits, discards changes to a file, and probably some other things I don’t know about. The Jack of all trades of Git commands.
git switch was introduced in Git version 2.23 to separate jumping from branch to branch into its own command. A checkout command would look like this:
git checkout my-feature
We can now replace that with switch:
git switch my-feature
But why is git switch a good thing?
More plain English
The main reason I like git switch is that it says what it means: switch to another branch. ‘Checking out’ another branch might make sense when we’re going back in time to have a quick look at (‘check out’), how things looked on an old commit before coming back to the present-day commit. But when when we plan to do work on a branch, we’re doing a lot more than just checking it out.
The semantics of ‘checking out’ could also be interpreted as leaving, not moving to; it’s a bit of an odd ball.
And if I’m teaching someone how to use Git, checkout has always required some explanation where switch won’t.
More sensible flags
I often like to create a new branch and ‘checkout on it’ in one move, so the following command gets a lot of use:
git checkout -b my-new-feature
Using the -b flag means ‘create a new branch that doesn’t already exist, then checkout on it’. b for ‘branch’ I guess, but that doesn’t quite make sense as we’re already doing something with a branch when we run the checkout command without the -b. So what does b stand for? Maybe ‘build’? Annoyingly, there isn’t a longhand for it, like -f has --force, so there’s no way of knowing for sure.
Happily, the switch equivalent of the -b flag makes much more sense:
git switch -c my-new-feature
c for ‘create’: we’re switching to and creating a branch. And -c has a longhand equivalent that confirms this meaning:
git switch --create my-new-feature
Single purpose
I mentioned that, as well as switching branches, git checkout allows you to jump back to a previous commit using a commit hash:
git checkout abc1234
You can also discard untracked changes to a file; for example, if I’ve made some changes to my homepage that I don’t want to keep, I might restore the file to its pre-edited state with:
git checkout index.html
You can’t do either of those things with git switch. And that’s a good thing in my eyes: one command should do one thing (which is why I also use git restore).
I’ll be using git switch to change branches in future.