git cherry-pick

Over the past 10 months working at DigitalOcean, I’ve come to learn more about git and how it can save me from my mistakes. This past week, I used git cherry-pick for the first time and wanted to share how you can use it as well.

While working on a ticket in a separate branch of my team’s project, I had to pause and jump back onto my master branch to debug some errors we were seeing in production. I proceeded to commit my changes, hop onto master, and resolve our issue. My mistake occurred when I dove back into my ticket work and somehow accidentally didn’t checkout to my separate branch. Always run git branch before picking up where you left off!

I finished up my work and was about to commit my changes when I realized my mistake and that I was still on the master branch. Before getting frustrated about how I was going to transfer my work to the correct branch, I thought to myself “hey, since git essentially allows us to write and edit our project history, there must be a way for me to move these changes from one branch to another”.

Off to Google I went and found the git cherry-pick command! If you didn’t know, cherry-pick allows you to grab a commit from one branch and write it to another branch. All you need to do is grab the the commit ID of the commit I wanted to move. Let’s breakdown the workflow.

I have my two branches master and ticket-work, and we want to move a commit from master to ticket-work. First, I commit those changes that I accidentally made to master. Then, I use git log to see the history of the commits on master.

$ git log

commit 0a5e736cvcf6b89894894b921d4858bb34417g21
Author: jzerwick <jrzerwick@gmail.com>
Date:   Wed Oct 2 00:11:23 2019 +0200

    Implemented changes

I’ll grab the commit ID of the commit I want to move 0a5e736cvcf6b89894894b921d4858bb34417g21, hop onto my other branch, and execute cherry-pick like so:

$ git checkout ticket-work
$ git cherry-pick 0a5e736cvcf6b89894894b921d4858bb34417g21

Now all that’s left is for me to delete that unwanted commit on master.
This can be done by using the reset command with the --hard flag like so:

$ git checkout master
$ git reset --hard HEAD^

The HEAD^ targets the last commit, which you can also target with HEAD~1. If you want to delete multiple commits, just specify the number of last commits after the ~ symbol. Removing the last two commits would use HEAD~2.

And that’s it! I now have the commit on the branch I wanted and master is back to its rightful state.

 
0
Kudos
 
0
Kudos

Now read this

Social Contracts in Learning

Recently, I’ve been thinking about how I approach my learning of new topics in software engineering and a big theme has been the use of social contracts. When I say social contract, I don’t mean the philosophical theory or model but... Continue →