Graphite Skill
Work with Graphite (
gt
) for creating, navigating, and managing stacked pull requests.
Quick Reference
I want to...
Command
Create a new branch/PR
gt create branch-name -m "message"
Amend current branch
gt modify -m "message"
Navigate up the stack
gt up
Navigate down the stack
gt down
Jump to top of stack
gt top
Jump to bottom of stack
gt bottom
View stack structure
gt ls
Submit stack for review
gt submit --no-interactive
Rebase stack on trunk
gt restack
Change branch parent
gt track --parent
gt track -p main gt restack Option B: Stash changes and start from main git stash git checkout main && git pull Create new branch and unstash: git checkout -b temp-working && git stash pop Proceed with gt track -p main and gt create Navigating a Stack
Move up one branch (toward top of stack)
gt up
Move down one branch (toward trunk)
gt down
Jump to top of stack
gt top
Jump to bottom of stack (first branch above trunk)
gt bottom
View the full stack structure
gt ls Modifying a Stack Amend Current Branch git add < files
gt modify -m "updated commit message" Reorder Branches Use gt move to reorder branches in the stack. This is simpler than trying to use gt create --insert . Re-parent a Stack If you created a stack on top of a feature branch but want it based on main:
Go to first branch of your stack
gt checkout < first-branch
Change its parent to main
gt track --parent main
Rebase the entire stack
gt restack Rename a Branch gt rename new-branch-name Resetting Commits to Unstaged Changes If changes are already committed but you want to re-stack them differently:
Reset the last commit, keeping changes unstaged
git reset HEAD^
Reset multiple commits (e.g., last 2 commits)
git reset HEAD~2
View the diff to understand what you're working with
- git
- diff
- HEAD
- Before Submitting
- Verify Stack is Rooted on Main
- Before running
- gt submit
- , verify the first PR is parented on
- main
- :
- gt
- ls
- If the first branch has a parent other than
- main
- :
- gt checkout
- <
- first-branch
- >
- gt track
- -p
- main
- gt restack
- Run Validation
- After creating each PR, run appropriate linting, building, and testing:
- Refer to the project's CLAUDE.md for specific commands
- If validation fails, fix the issue, stage changes, and use
- gt modify
- Submitting and Updating PRs
- Submit the Stack
- gt submit --no-interactive
- Update PR Descriptions
- After submitting, use
- gh pr edit
- to set proper titles and descriptions.
- IMPORTANT:
- Never use Bash heredocs for PR descriptions - shell escaping breaks markdown tables, code blocks, etc. Instead:
- Use the
- Write
- tool to create
- /tmp/pr-body.md
- with the full markdown content
- Use
- gh pr edit
- with
- --body-file
- :
- gh
- pr
- edit
- <
- PR_NUMBER
- >
- --title
- "stack-name: description"
- --body-file /tmp/pr-body.md
- PR descriptions must include:
- Stack Context
-
- What is the bigger goal of this stack?
- What?
- (optional for small changes): Super terse, focus on what not why
- Why?
- What prompted the change? Why this solution? How does it fit into the stack? Example (for a PR in a 3-PR stack adding a warning feature):
Stack Context This stack adds a warning on the merge button when users are bypassing GitHub rulesets.
Why?
Users who can bypass rulesets (via org admin or team membership) currently see no indication
they're circumventing branch protection. This PR threads the bypass data from the server to
enable the frontend warning (PR 2) to display it.
Troubleshooting
Problem
Solution
"Cannot perform this operation on untracked branch"
Run
gt track -p main
first
Stack parented on wrong branch
Use
gt track -p main
then
gt restack
Need to reorder PRs
Use
gt move
Conflicts during restack
Resolve conflicts, then
git rebase --continue
Want to split a PR
Reset commits (
git reset HEAD^
), re-stage selectively, create new branches
Need to delete a branch (non-interactive)
gt delete
1. Checkout the branch you want to rebase
git checkout my-feature-branch
2. Rebase onto the target (e.g., updated parent branch)
git rebase target-branch
3. If you hit conflicts:
- Resolve the conflict in the file
- Stage it: git add
- Continue: git rebase --continue
4. If a commit is obsolete and should be skipped:
git rebase --skip
5. After rebase, use gt modify to sync graphite's tracking
gt modify --no-edit Recovering from Interrupted Rebase (Context Reset) If a rebase was interrupted (e.g., Claude session ran out of context): Check status: git status
Look for "interactive rebase in progress" and "Unmerged paths"
Read the "unmerged" files - they may already be resolved (no conflict markers) If already resolved, just stage and continue: git add < resolved-files
git rebase --continue If still has conflict markers , resolve them first, then stage and continue Deleting Branches from a Stack
Delete a branch (non-interactive, even if not merged)
gt delete branch-to-delete -f -q
Also delete all children (upstack)
gt delete branch-to-delete -f -q --upstack
Also delete all ancestors (downstack)
- gt delete branch-to-delete
- -f
- -q
- --downstack
- Flags:
- -f
- /
- --force
-
- Delete even if not merged or closed
- -q
- /
- --quiet
- Implies --no-interactive , minimizes output After deleting intermediate branches , children are automatically restacked onto the parent. If you need to manually update tracking: gt checkout child-branch gt track --parent new-parent-branch