Git cherry-picking: A detailed tutorial (with examples)

Updated: January 28, 2024 By: Guest Contributor Post a comment

When working with Git, one of the most powerful features at your disposal is cherry-picking. This technique allows you to pick and choose specific commits from one branch and apply them to another. While immensely helpful, cherry-picking can be confusing for beginner and intermediate Git users alike. This tutorial aims to demystify the cherry-picking process with a series of examples scaling from basic to advanced use-cases.

Understanding Cherry-Picking in Git

Before diving into cherry-picking, let’s ensure that we understand the basic concepts. Cherry-picking in Git entails taking a commit from one branch and applying it as a new commit on another branch. This is particularly useful when you need to include a bug fix or feature that’s been developed on a separate branch into your current working branch.

Pre-requisites

  • Basic knowledge of Git and how to use it for version control.
  • Git installed on your development machine.
  • An existing Git repository with multiple branches to practice cherry-picking.

Basic Cherry-Picking

Let’s start with a simple cherry-pick operation. In this scenario, you’ve identified a commit in a branch named feature that you want to apply to your master branch.

# First, verify the commit to cherry-pick by looking at the commit history
$ git log feature

# Once you've found the commit, note its SHA-1 hash
# For this example, we'll say the commit hash is abc1234

# Checkout to your target branch
$ git checkout master

# Perform the cherry-pick operation
$ git cherry-pick abc1234

After executing git cherry-pick abc1234, the changes from commit abc1234 are now applied to master.

Resolving Conflicts during Cherry-Picking

Conflicts can arise during cherry-picking if the commit contains changes that are incompatible with the current branch. Here’s how to resolve them:

# Start the cherry-pick operation (as shown previously)
$ git cherry-pick abc1234

# If a conflict arises, Git will pause the operation and alert you to resolve it
# Edit the conflicted files in your preferred text editor, making the necessary adjustments

# After resolving conflicts, add the resolved files to the staging area
$ git add <file name>

# Continue the cherry-pick operation
$ git cherry-pick --continue

Once the conflict is resolved, the cherry-pick operation will complete, creating a new commit on your current branch with the changes.

Picking Multiple Commits

Cherry-picking can be extended to apply a range of commits. This is useful when you want to include a sequence of changes. However, note that you must cherry-pick commits in chronological order to avoid conflicts.

# To cherry-pick a range of commits, provide the range to cherry-pick
$ git cherry-pick <hash-of-first-commit>^..<hash-of-last-commit>

# Replace ^ with ~1 if you are using equivalent syntax
$ git cherry-pick <hash-of-first-commit>~1..<hash-of-last-commit>

Advanced Cherry-Picking with Interactive Rebase

For more fine-grained control over cherry-picking, an interactive rebase allows you to choose multiple commits from a list. This is especially useful for reordering, omitting, or editing commits as you cherry-pick.

# Start an interactive rebase on the branch with the commits you want to cherry-pick
$ git checkout feature
$ git rebase -i master

# Git will display a list of commits in your text editor
# Use the 'pick' command on the commits you want to transfer to the master branch
# After saving and closing the editor, perform the cherry-pick
$ git checkout master
$ git cherry-pick <commit-range>

Cherry-Pick into a New Branch

If you’d like to apply changes to an entirely new branch without altering the existing branches, you can do this through cherry-picking.

# From your current branch, create a new branch
$ git checkout -b new-branch

# Now you can cherry-pick into the new branch
$ git cherry-pick abc1234

Best Practices for Cherry-Picking

  • Avoid cherry-picking between public branches to prevent duplicate commits with different hashes.
  • Consider using merge or rebase instead of cherry-picking for integrating full branches, as they preserve the commit history.
  • Communicate with your team when you perform cherry-picks to avoid confusion in the commit history.

Conclusion

To wrap up, cherry-picking is a powerful Git feature that’s invaluable when you need to incorporate selected changes from other branches. Through careful use and a better understanding of its consequences, it can significantly improve your workflow.