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_TOKENenvironment variable.
Supported formats:
For commits:
- Owner/RepoName/commit
- https://github.com/Owner/RepoName/commit/09588bb
For branches:
- Owner/RepoName@branch
- https://github.com/Owner/RepoName/tree/branch
For pull requests:
- Owner/RepoName#123
- https://github.com/Owner/RepoName/pull/123
Development
uv sync
uv run pre-commit install
Then commit your changes and send a pull request!
Thanks
mcstatusfor linter settings
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)
| File | Size | Uploaded | |
|---|---|---|---|
| ghcherry-1.6.0.tar.gz | 65.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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