Skip to main content

cherry-pick

Cherry-pick a commit from origin/main into a release branch using a temporary git worktree

Source facts

Repository
ai-dynamo/aiperf
Last source activity
May 7, 2026 at 19:33
Detected SKILL.md language
English
Stars
753
Forks
212

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
cherry-pick
description
Cherry-pick a commit from origin/main into a release branch using a temporary git worktree
disable-model-invocation
true
allowed-tools
Bash(git fetch *), Bash(git log *), Bash(git branch *), Bash(git worktree *), Bash(git cherry-pick *), Bash(git -C * status), Bash(git -C * cherry-pick *), Bash(git -C * checkout *), Bash(git -C * push *), Bash(git -C * branch *), Bash(git push *), Bash(git commit *), Bash(git checkout *), Bash(mktemp *), Bash(make *), Bash(gh pr create *), Bash(gh api *), AskUserQuestion
# Cherry-Pick to Release Branch Cherry-pick a commit from `origin/main` into a release branch using a temporary git worktree. ## Resume Check Before starting, check if there is an existing cherry-pick worktree from a previous run: ```bash git worktree list | grep cherry-pick/ ``` If there is a worktree on a `cherry-pick/*` branch, a previous cherry-pick may have stopped due to conflicts. Ask the user if they want to resume it. If yes: 1. Set `WORKTREE_DIR` to the existing worktree path. 2. Check the cherry-pick state: ```bash git -C "$WORKTREE_DIR" status ``` - If the cherry-pick is still in progress (conflicts resolved, staged), run `git -C "$WORKTREE_DIR" cherry-pick --continue` to finalize. - If the working tree is clean (cherry-pick already completed), proceed to push. 3. Recover the original source commit SHA from the worktree's branch name (it's encoded as `cherry-pick/<source-sha>-to-<release-branch>`): ```bash BRANCH=$(git -C "$WORKTREE_DIR" branch --show-current) SOURCE_SHA=${BRANCH#cherry-pick/} SOURCE_SHA=${SOURCE_SHA%-to-*} ``` Do NOT use the worktree's HEAD SHA — that's the new cherry-pick commit, not the original. Then run step 4 with `$SOURCE_SHA` to gather the original PR metadata. 4. Continue from step 10 (push) onward. If the user does not want to resume, clean up the stale worktree first, then start fresh. ## Steps 1. **Fetch latest from origin:** ```bash git fetch origin ``` 2. **Show recent commits on origin/main:** Run `git log origin/main --oneline -20` to get the list. 3. **Ask the user which commit to cherry-pick:** Use `AskUserQuestion` to present the recent commits as options. Let the user select one. 4. **Look up the original PR for the selected commit:** `gh pr view` does not accept a commit SHA, so query the commits→pulls API directly: ```bash gh api repos/ai-dynamo/aiperf/commits/<source-commit-sha>/pulls \ --jq '.[0] | "\(.number)\t\(.title)"' ``` Save the PR number and title for use in steps 11 and 13. If the commit message contains a PR number (e.g. `(#669)`), you can also use that directly. 5. **Find all release branches:** Run `git branch -r --list 'origin/release/*'` to get all remote release branches matching `release/X.X.X`. 6. **Ask the user which release branch to target:** Use `AskUserQuestion` to present the release branches as options. The most recent version (highest semver) should be the first option marked as "(Recommended)". 7. **Create a temporary worktree on a feature branch:** Release branches are protected, so work on a `cherry-pick/` feature branch from the start. This also makes the worktree identifiable for resume if conflicts occur. ```bash WORKTREE_DIR=$(mktemp -d) git worktree add "$WORKTREE_DIR" origin/<release-branch> git -C "$WORKTREE_DIR" checkout -b cherry-pick/<commit-hash>-to-<release-branch> ``` 8. **Set up the environment in the worktree (required for pre-commit hooks):** ```bash make -C "$WORKTREE_DIR" first-time-setup ``` 9. **Cherry-pick the commit:** ```bash git -C "$WORKTREE_DIR" cherry-pick <commit-hash> ``` If there are conflicts: - Do NOT force resolve conflicts automatically. - Do NOT clean up the worktree — leave it in place so the user can fix conflicts. - Tell the user: 1. The worktree path: `$WORKTREE_DIR` 2. To resolve conflicts in that directory, stage the fixes, then run: `git -C "$WORKTREE_DIR" cherry-pick --continue` 3. If conflict resolution requires a separate commit (not `cherry-pick --continue`), use `git commit -s` with a HEREDOC message. 4. Once resolved, re-run `/cherry-pick` to resume (it will detect the existing worktree). 10. **Push the feature branch:** ```bash git -C "$WORKTREE_DIR" push -u origin HEAD ``` 11. **Create PR (optional — requires `gh` CLI):** If `gh` is available and authenticated, create the PR automatically: ```bash gh pr create \ --repo ai-dynamo/aiperf \ --head cherry-pick/<commit-hash>-to-<release-branch> \ --base <release-branch> \ --label cherry-pick \ --title "<original commit title> (cherry-pick to <release-branch>)" \ --body "$(cat <<'EOF' ## Summary - Cherry-pick of <commit-hash> from `main` into `<release-branch>` - Original PR: #<original-pr-number> — <original commit title> ## Conflicts <If conflicts were resolved, list the files and briefly describe the resolution. Otherwise write "None — clean cherry-pick."> EOF )" ``` If `gh` is not set up or the command fails, skip this step and tell the user to create the PR manually at: `https://github.com/ai-dynamo/aiperf/compare/<release-branch>...cherry-pick/<commit-hash>-to-<release-branch>` 12. **Clean up the worktree:** ```bash git worktree remove "$WORKTREE_DIR" ``` 13. **Print a summary.** Output the following (NOT inside a code block): Cherry-pick complete: `<commit-hash-short>` → `<release-branch>` <original commit title> PR Main: <original-pr-number> :git-merged: https://github.com/ai-dynamo/aiperf/pull/<original-pr-number> PR Release: <cherry-pick-pr-number> :pr-opened: https://github.com/ai-dynamo/aiperf/pull/<cherry-pick-pr-number> If step 11 was skipped (no PR created), omit the PR Release line and instead print the manual comparison URL from step 11's fallback. ## Rules - NEVER add a `Co-Authored-By` line - NEVER manually add a `Signed-off-by` line — `git commit -s` handles this automatically - If the cherry-pick results in a new commit (e.g. conflict resolution), use `git commit -s` with a HEREDOC message - NEVER use `--no-verify` - NEVER force push - NEVER use `git stash`, `git reset`, `git revert`, `git checkout -- <file>`, `git restore`, or `git clean` - Always clean up the worktree after a successful push or if the user abandons the cherry-pick - On cherry-pick conflicts: do NOT clean up the worktree — leave it for the user to resolve, then resume - If anything else fails, clean up the worktree and report the error to the user
View on GitHub