Skip to main content

GitHub cherry-pick

Cherry-pick commits across GitHub repositories using only the GitHub API.

Uses the algorithm described by Jim's Stack Overflow answer to perform a cherry-pick entirely through the GitHub REST API. This is much better than doing that through patches (e.g. patch2pr), because git is much smarter with resolving conflicts on commits instead of patches.

When I used patch2pr, I had to constantly rebase my patches, because on almost every update they would raise conflicts. Cherry-picking those commits works perfectly fine!

Installation

Requires Python 3.10+, I recommend using uv, but it will work fine with pip or anything else.

uv tool install ghcherry

Or run directly without installing:

uvx ghcherry --help

Usage

This tool requires a classic token with repo and workflow permissions (workflow is needed only if commits update .github/workflows files) or a fine-grained token with contents and workflows permissions.

If you want to cherry-pick commits in private repositories, the tool also requires Pull requests permission for fine-grained tokens.

GITHUB_TOKEN=ghp_... ghcherry \
  --target MyOrg/nixpkgs@patched \
  `: # cherry-pick these commits` \
  NixOS/nixpkgs/3f5ba52cc4701bf341457dfe5f6cb58e0cbb7f83 \
  NixOS/nixpkgs/49ba75ed \
  `: # or merge the entire branch!` \
  Someone/nixpkgs@pr-branch \
  `: # or even cherry-pick every commit for a pull request!` \
  NixOS/nixpkgs#380691

Arguments

You can give commits, branches and or pull requests as positional arguments. Commits will be cherry-picked, while branches will be merged into the target. For pull requests, we will collect PR's commits and add it to the list of commits to cherry-pick.

Each commit/branch/PR is applied in order and builds upon the previous result.

  • --target/-T: Required. Target branch to which to apply cherry-picks.
  • --first-hard-reset-to/-H: Hard reset target to this commit, before doing anything else.
  • --pr-commits-limit: If you specify PR to cherry-pick, this is the maximum amount of commits that the pull request can have.
  • --token/-t: GitHub token. If not specified, falls back to the $GITHUB_TOKEN environment variable.

Supported formats:

For commits:

For branches:

For pull requests:

Development

uv sync
uv run pre-commit install

Then commit your changes and send a pull request!

Thanks

Release files for ghcherry 1.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ghcherry 1.6.0
File Size Uploaded
ghcherry-1.6.0.tar.gz 65.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ghcherry 1.6.0
File Interpreter ABI Platform
ghcherry-1.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 80.1 kB

Release files / ghcherry-1.6.0.tar.gz

Download URL ghcherry-1.6.0.tar.gz
Size 65.2 kB
Tags Source
SHA-256 checksum
How to use checksums
f43f3d97b5afffb05a411164e16afa150ba0b66fd393c1e903645e9e670ad123
BLAKE2b-256 checksum
How to use checksums
5d94a0bc789195e475eb79b8e9e8678802c53cbd9eed8731e4ed1aaa11129f6a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 16, 2026.

Transparency log

Release files / ghcherry-1.6.0-py3-none-any.whl

Download URL ghcherry-1.6.0-py3-none-any.whl
Size 14.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5337179a636bc476c9189d03eab7546f0e4415bcc989e31c95ff1961d654a78f
BLAKE2b-256 checksum
How to use checksums
143fc12cf5d71d4a5bb54a489e7721ea8aef7fd7354fb4769b7fee9699a2bdae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 16, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.6.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page