Add reusable skill definitions for common contributor workflows: - commit: creates conventional commits with proper type(scope) format - pr: creates PRs with conventional commit titles - rebase-onto-main: handles rebasing onto main when parent branches were squash-merged
2.4 KiB
name, description, argument-hint, allowed-tools
| name | description | argument-hint | allowed-tools |
|---|---|---|---|
| rebase-onto-main | Rebase a branch onto main, handling squash-merged parent branches cleanly | [optional: branch name, defaults to current branch] | Bash, Read, Glob, Grep, Agent |
Rebase Branch onto Main
Rebase the current (or specified) branch onto main, correctly handling the case where the branch was built on top of another branch that has since been squash-merged into main.
Background
When a parent branch is squash-merged, its individual commits become a single new commit on main with a different hash. A normal git rebase main will try to replay the parent's original commits, causing messy conflicts. The fix is to cherry-pick only the commits unique to this branch onto a fresh branch from main.
Steps
-
Identify the branch. Use
$ARGUMENTSif provided, otherwise use the current branch. -
Fetch and update main:
git fetch origin main:main -
Find the merge base between the branch and
main:git merge-base <branch> main -
List all commits on the branch since the merge base:
git log --oneline <merge-base>..<branch> -
Identify which commits are unique to this branch vs. inherited from a parent branch. Look for:
- Squash-merged commits on
mainthat correspond to a group of commits at the bottom of the branch's history (check PR titles, commit message keywords). - The boundary commit: the first commit that belongs to this branch's work, not the parent's.
- If ALL commits are unique (no parent branch), just do a normal
git rebase mainand skip the rest.
- Squash-merged commits on
-
Create a fresh branch from
main:git checkout -b <branch>-rebase main -
Cherry-pick only the unique commits (oldest first):
git cherry-pick <first-unique-commit>^..<branch>The
A^..Brange means "from the parent of A through B inclusive." -
Handle conflicts if any arise during cherry-pick. Resolve and
git cherry-pick --continue. -
Replace the old branch:
git branch -m <branch> <branch>-old git branch -m <branch>-rebase <branch> -
Verify the result:
git log --oneline main..<branch>Confirm only the expected commits are present.
-
Ask the user before force-pushing. When approved:
git push origin <branch> --force-with-lease -
Clean up the old branch:
git branch -D <branch>-old