This post was originally posted on my blog.
As a developer, I use git on a daily basis. It has become an essential tool for my work. It’s great and I love it.
I also enjoy interacting with it directly in the Terminal. There’s something magical in writing a command and seeing it do something. I’ve tried using GitHub Desktop for some time but always came back to the Terminal.
There’s one command, though, that I used to like and hate at the same time. It’s
I like it because of its simplicity and effectiveness. With it, I can create a new branch and switch to it all at once. Just like this:
git checkout -b new-feature
But, in some cases, I hated it too because of the way it works. Using it as above creates a branch that is based off of the one I’m currently on and that isn’t something I always want.
Here’s a use case that I might have during my work.
Say I’m on a
new-feature branch and have some changes, not related to the current task, I want to transfer to a new branch. Simply using
git checkout -b new-awesome-feature will not help me because all commits made thus far will follow as well. In those scenarios my workflow was:
- Stash everything.
- Switch to the branch I want to base the new one off.
git checkoutcommand to create a new branch and switch to it.
- Pop the changes from the stash and continue working with them.
In code that looks like this:
git stash git checkout master git checkout -b new-awesome-feature git stash pop
Definitely not the best workflow.
About a month ago I decided to see if I could streamline this process because I wasn’t quite happy with its current form. So I opened the
git checkout docs and started to dig in. Fortunately, the solution was right there! Among the many options on that page, there’s one called
<start_point>. By using it, I can specify a starting point for the new branch. It says that I can use “the name of a commit” but there’s actually more to it. Following the link to
git branch reveals that ”[
<start-point>] may be given as a branch name, a commit-id, or a tag”. This was exactly what I was looking for!
So now, whenever I want to transfer changes to a new branch that must have a different starting point than the current one, I use:
git checkout -b <branch-name> <start-point>
All four steps from above are down to just one! Pure enjoyment!
Ever since I found this, I’m at peace with the
checkout command. I like it even more. Hope you do as well!