Cherry-pick: The Palantír of Commits
In Git’s legendarium, git cherry-pick is the Palantír that lets you summon a single shard of history from a remote branch into the present. Like the seeing-stones of Númenor, the power is immense—and so are the risks if you stare for too long.
Why cherry-pick feels like using a seeing-stone
git cherry-pick <hash> lets you grab one specific commit from another branch and replay it in your current timeline.
- Surgical hotfixes: apply a production fix straight onto a release branch.
- Selective backports: bring only the stable features from a later release.
- Documentation sync: duplicate doc commits without merging entire branches.
Beware of the tempting visions
Saruman lost himself in the Palantír. Overusing cherry-pick can have similar side effects: duplicated commits, tangled history, and endless conflict resolution.
- Duplicate commits with different hashes make blame harder.
- Recurring conflicts appear each time you cherry-pick the same files.
- Loss of context when you avoid the natural merge/rebase flow.
Elven best practices
- Keep commits small and descriptive before cherry-picking them.
- Preserve references (
(cherry picked from commit ...)) in the new commit message. - Prefer merge/rebase when branches stay active together for a long time.
Scout the battlefield before the ritual
Before touching the seeing-stone, wise captains inspect the ground.
# 1) Confirm you are on the right branch
git switch release/1.8
# 2) Inspect the commit you want to summon
git show --stat --patch 8f9d1e
# 3) Check whether it is already present in your line
git branch --contains 8f9d1e
If git branch --contains already includes your current branch, that shard of history is already here, and replaying it may create duplication.
Picking multiple shards at once
Elves chronicle history in sequences. With git cherry-pick A^..B you can replay a contiguous range.
git fetch origin
# Apply three commits from "eregion-labs" onto "gondor-fix"
git cherry-pick 3a1b2c^..d4e5f6
For non-consecutive commits: git cherry-pick hash1 hash2 hash3. Git replays them in the order you specify.
When the sequence is long and you need precise ordering, let rev-list gather the path:
# Oldest to newest, only commits not yet in release/1.8
git cherry-pick $(git rev-list --reverse --no-merges release/1.8..main)
Use this carefully: for long chains, split into smaller batches so conflict resolution stays manageable.
Advanced powers of the seeing-stone
Different invocations produce very different outcomes:
# Record the source commit in the new message
git cherry-pick -x 8f9d1e
# Apply changes without creating a commit yet
git cherry-pick -n 8f9d1e
# Cherry-pick a merge commit (choosing the mainline parent)
git cherry-pick -m 1 a1b2c3d
-x: appends source reference automatically for traceability.-n(--no-commit): useful when combining multiple picks into one curated commit.-m: required when the source is a merge commit; Git needs to know which parent is the baseline.
For deeper craft, a few lesser-known options can save entire campaigns:
# If a commit becomes empty because the change already exists
git cherry-pick --empty=drop 4c5d6e7
# Keep an explicit empty commit for audit trace
git cherry-pick --allow-empty 4c5d6e7
--empty=drop: avoids noisy duplicate history.--allow-empty: useful in regulated workflows where documenting evaluation matters.
Clean backports across release lines
When moving fixes from main into a stable release, use a repeatable sequence:
git switch release/1.8
git pull --ff-only
# Example: bring two targeted fixes and keep source trace
git cherry-pick -x 91ab2cd e3f4567
# Quick verification
git log --oneline --decorate -5
git show --stat HEAD
This keeps maintenance predictable and leaves a clear trail for future stewards of the repository.
Handling conflicts without summoning Sauron
When timelines collide you may see familiar warnings:
git cherry-pick 8f9d1e
# CONFLICT (content): Merge conflict in palantir/seeing-stones.ts
- Fix the files manually.
- Stage them with
git add. - Finish with
git cherry-pick --continue.
Need to flee? git cherry-pick --abort restores the worktree.
If you are replaying a sequence and one commit is irrelevant, git cherry-pick --skip moves to the next one.
If a pick is already completed and shared, prefer git revert on the new commit rather than rewriting public history.
Emergency recovery via reflog
Even wise captains misread a vision. Reflog remains your secret map:
git reflog -10
# identify the previous state, then:
git reset --hard HEAD@{1}
Use reset --hard only when you are sure local uncommitted changes can be discarded.
Recommended workflow
| Situation | Strategy | Reason |
|---|---|---|
| Urgent production fix | Single cherry-pick | Minimal code movement |
| Long-lived feature integration | Merge or rebase | Keeps history readable |
| Multiple release lines | Branch per release + selective cherry-picks | Predictable maintenance |
Rangers’ quick checklist
- Always inspect with
git showbefore picking. - Use
-xfor team workflows: incident response and audits become clearer. - After each pick, run quick tests and inspect history with
git log --oneline --graph -20. - If conflicts keep repeating, pause and switch to merge or rebase.
Conclusion
Elrond reminds us: “The Palantíri are not wholly evil”. Cherry-pick is invaluable when you must transplant a precise change across realms. Respect the history, annotate your actions, and this seeing-stone will guide you safely through parallel timelines of your repository.