Cherry-picking a commit

Cherry-picking is the act of selecting a specific commit or set of commits and applying them to a different branch. It allows you to extract a change or a series of changes from one branch and apply them to another branch without merging the entire branch.

It can also be used to apply a series of commits that are not sequential in a branch to another branch in a specific order.

Cherry-picking can sometimes result in conflicts, especially if the changes you’re trying to apply conflict with changes in the destination branch. In such cases, you’ll need to resolve the conflicts manually before completing the cherry-pick process.

Syntax

Suppose you have two branches: main and feature. You want to apply the changes from the commit with hash xyx from the main branch to the feature branch.

First, switch to the feature branch:

git checkout feature

Next, cherry-pick the commit from the main branch:

git cherry-pick xyz

This will apply the changes from the commit with hash xyz from thee main branch to the feature branch. This will create a new SHA on feature (pqr) but the changes will be identical.

The benefit is that you only take the select changes you want, you are not merging the whole main branch into feature.

Note that you can also cherry-pick multiple commits by specifying their hashes separated by spaces:

git cherry-pick abcdefg hijklmn opqrst

Limitations

  • You don’t have to just cherry-pick locally, you can also cherry-pick from a remote tracking branch.
  • You cannot cherry-pick merge commits since these commits do not implement a set of changes, they are connecting commits.

Use case

The time when I have cherry-picked is when a commit has been reverted via GitHub. This typically happens on the main branch when breaking changes have been merged and we want to undo this by reverting back to the previous commit, from before the problematic commit was merged in.

In this scenario, you will want to start from the reverted main branch and then cherry-pick the breaking commit. You can then fix the bug and keep an accurate record of the whole history.