graphite

v2026.09.25

Manage stacked PRs with Graphite CLI (gt) instead of git for branch/PR operations. Auto-detects Graphite repos via .git/.graphite_repo_config. Use when: creating stacked PRs, navigating branches, submitting PRs, syncing with main, restacking after changes, or any gt command usage.

GitHub
Install command
npx skhub add lightdash/graphite
Markdown
SKILL.md

Graphite Stacked PRs

Use Graphite CLI (gt) instead of raw git for all branch and PR operations in Graphite-initialized repos.

Detection

A repo is Graphite-initialized if .git/.graphite_repo_config exists. When detected, prefer gt over git for branch/PR workflows.

MCP Tools

The Graphite MCP server (gt mcp) is available. Use the learn_gt and run_gt_cmd tools when available:

  • learn_gt — look up gt command documentation
  • run_gt_cmd — execute gt commands directly

Key Concepts

  • A stack is a sequence of PRs, each building on its parent
  • Each PR must be atomic — self-contained and CI-green independently
  • Stacks are visualized with trunk at the BOTTOM:
    • Up/Upstack = away from trunk toward leaves
    • Down/Downstack = toward trunk/main
PR #3 (top)
   |
PR #2
   |
PR #1
   |
main (trunk)

Command Reference

Branch Navigation

CommandDescription
gt checkout [branch]Switch branches (interactive picker if no arg)
gt co mainSwitch to trunk
gt up [steps]Navigate to child branch
gt down [steps]Navigate to parent branch
gt topJump to top of stack
gt bottomJump to trunk-closest branch

Creating & Modifying Branches

CommandDescription
gt create -a -m "message"Create new branch with staged changes
gt c --no-interactive -m "message"Create new branch (non-interactive)
gt modify --no-interactiveAmend current commit
gt m --no-interactiveShort form: amend current commit
gt modify -aAmend with staged changes, then restack
gt modify --commit -a -m "msg"Add explicit commit (for review feedback)
gt delete [name]Delete branch and metadata
gt rename [name]Rename branch

Stack Operations

CommandDescription
gt restackRebase dependent branches after changes
gt sync --no-interactivePull latest main, delete merged branches, rebase
gt foldMerge branch into its parent
gt splitBreak branch into multiple branches
gt squashConsolidate commits in branch
gt reorderReorder branches in stack
gt move --onto <branch>Move branch to different parent

Submitting PRs

CommandDescription
gt submit --no-interactivePush and create/update PR for current branch
gt s --no-interactiveShort form: submit current branch
gt s --stack --no-interactiveSubmit current + all descendant branches
gt ssAlias for gt submit --stack
gt s --draft --no-interactiveSubmit as draft PR
gt submit --reviewers alice,bobAssign reviewers

Viewing

CommandDescription
gt log / gt lShow stack visualization
gt log short / gt lsAbbreviated stack view
gt pr [branch]Open PR in browser
gt info [branch]Display branch details

Recovery

CommandDescription
gt continueResume halted operation (after conflict resolution)
gt abortCancel current operation
gt undoRevert last operation

Git-to-Graphite Translation

Instead of...Use...
git checkout -b branchgt c --no-interactive -m 'message'
git pushgt s --no-interactive
git rebase maingt restack
git commit --amendgt m --no-interactive
git pull origin maingt sync --no-interactive

Workflow Rules

Branch Selection Decision Tree

SituationAction
On main?Never commit to main. Create new branch: gt c --no-interactive -m 'message'
On a branch + changes are related WIP?Amend in place: gt m --no-interactive
On unrelated branch + independent changes?gt co main then create new branch
On a branch + changes depend on it?Create stacked branch: gt c --no-interactive -m 'message'

Always Use --no-interactive

All gt commands that support it should use --no-interactive to avoid blocking on prompts. Key commands:

  • gt c --no-interactive -m 'message'
  • gt m --no-interactive
  • gt s --no-interactive or gt s --stack --no-interactive
  • gt sync --no-interactive

Staging Rules

  1. Check if working tree is dirty (git diff)
  2. Never mix different fixes/features/WIP together
  3. Stage only one set of related changes using git add <specific-files>

Commit Messages

Use semantic commit names: feat:, fix:, chore:, refactor:, docs:, test:

Submitting

  • Submit WIP as draft: gt s --draft --no-interactive
  • Submit final work: gt s --no-interactive
  • Submit entire stack: gt s --stack --no-interactive

For PR title/description conventions (Linear ticket, GitHub issue, no customer names), use the creating-pull-requests skill.

Handling Conflicts

# During restack, if conflicts occur:
# 1. Resolve conflicts in the files
# 2. Stage resolved files
git add <resolved-files>
# 3. Continue the operation
gt continue

Completion Criteria

  • Working tree must be clean (no unstaged/untracked changes)
  • All branches in the stack are submitted
  • gt log shows the correct stack structure

Creating a Stack (Typical Flow)

# Start from trunk
gt co main
gt sync --no-interactive

# Create first PR
# ... make changes ...
git add <specific-files>
gt c --no-interactive -m 'feat: add database migration'

# Create second PR on top
# ... make changes ...
git add <specific-files>
gt c --no-interactive -m 'feat: add backend service'

# Create third PR on top
# ... make changes ...
git add <specific-files>
gt c --no-interactive -m 'feat: add frontend components'

# Submit entire stack
gt s --stack --no-interactive

# Verify
gt log

Addressing Review Feedback

# Navigate to the PR that needs changes
gt checkout branch-name

# Make changes, stage them
git add <specific-files>

# Amend and restack all branches above
gt m --no-interactive

# Push updates for the whole stack
gt s --stack --no-interactive
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.25

Published

Sep 25, 2026

Category

Uncategorized

License

NOASSERTION

Source path

.claude/skills/graphite

Default branch

main

Latest commit

f6f90fa

Tree SHA

d0aa581