Git Tip: Cherrypicking out of a bind!
There are times I forget to create a new branch when I'm working on a new feature and only notice the mistake when push my first commit, but just today one of my co-workers (Jonathan) showed me some neat git tricks that helped me correct my mistake. In this article I'll show how to use cherrypicking to get out of a bind.
For the purposes of this blog post, we'll set up a contrived example by creating a git repo and adding an empty Readme.md file
and making this our initial commit. Running
git log should now only display 1 commit:
We create a branch and add a header to our Readme and commit:loading
Our git log should now have the following commits:loading
We can pretend that this is a complete feature and that we pushed this to origin and opened a PR.
Frequently after I do this, I start working on a new feature branch and assume I created a new branch from master.
But I normally only realize that I'm still on the old branch after I make my first commit (and push to origin). Lets simulate
this mistake by adding another paragraph header to the readme and commiting it in
branch-1. Now our logs should look similar
When this happens I normally want to place the latest commit in a new branch and continue working from there, while also deleting
the latest commit from the original branch. We can accomplish this by using git's
Copy the hash of the commit we want to remove. In this example it is c1086ef12918f774075f1d269f70b205e2730ee2.
Checkout master (git checkout master).
Create a new branch (git checkout -b branch-2).
Cherry pick the commit (git cherry-pick c1086ef12918f774075f1d269f70b205e2730ee2).
We may decide to push this branch to master (git push -u origin HEAD).
Checkout the old branch (git checkout -b branch-1).
Remove the latest commit (git reset --hard HEAD~1). At this point if we print our git logs, it should only contain the first two commits we made:
- Force push to origin so it is also removed there (git push -f).
Git provides tools for manipulating commits and branches that allow us to fix most of our blunders.
have proven to be useful commands that often help me correct my mistakes.