graphite

Work with Graphite (gt) for stacked PRs - creating, navigating, and managing PR stacks.

npx skills add https://github.com/withgraphite/agent-skills --skill graphite

Graphite Skill

Work with Graphite (gt) for creating, navigating, and managing stacked pull requests.

Quick Reference

I want to...Command
Create a new branch/PRgt create branch-name -m "message"
Amend current branchgt modify -m "message"
Navigate up the stackgt up
Navigate down the stackgt down
Jump to top of stackgt top
Jump to bottom of stackgt bottom
View stack structuregt ls
Submit stack for reviewgt submit --no-interactive
Rebase stack on trunkgt restack
Change branch parentgt track --parent <branch>
Rename current branchgt rename <new-name>
Move branch in stackgt move

What Makes a Good PR?

In roughly descending order of importance:

  • Atomic/hermetic - independent of other changes; will pass CI and be safe to deploy on its own
  • Narrow semantic scope - changes only to module X, or the same change across modules X, Y, Z
  • Small diff - (heuristic) small total diff line count

Do NOT worry about creating TOO MANY pull requests. It is always preferable to create more pull requests than fewer.

NO CHANGE IS TOO SMALL: tiny PRs allow for the medium/larger-sized PRs to have more clarity.

Always argue in favor of creating more PRs, as long as they independently pass build.


Branch Naming Conventions

When naming PRs in a stack, follow this syntax:

terse-stack-feature-name/terse-description-of-change

For example, a 4 PR stack:

auth-bugfix/reorder-args
auth-bugfix/improve-logging
auth-bugfix/improve-documentation
auth-bugfix/handle-401-status-codes

Creating a Stack

Basic Workflow

  1. Make changes to files
  2. Stage changes: git add <files>
  3. Create branch: gt create branch-name -m "commit message"
  4. Repeat for each PR in the stack
  5. Submit: gt submit --no-interactive

Handle Untracked Branches (common with worktrees)

Before creating branches, check if the current branch is tracked:

gt branch info

If you see "ERROR: Cannot perform this operation on untracked branch":

Option A (Recommended): Track temporarily, then re-parent

  1. Track current branch: gt track -p main
  2. Create your stack normally with gt create
  3. After creating ALL branches, re-parent your first new branch onto main:
    gt checkout <first-branch-of-your-stack>
    gt track -p main
    gt restack
    

Option B: Stash changes and start from main

  1. git stash
  2. git checkout main && git pull
  3. Create new branch and unstash: git checkout -b temp-working && git stash pop
  4. 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:

  1. Refer to the project's CLAUDE.md for specific commands
  2. 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:

  1. Use the Write tool to create /tmp/pr-body.md with the full markdown content
  2. 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

ProblemSolution
"Cannot perform this operation on untracked branch"Run gt track -p main first
Stack parented on wrong branchUse gt track -p main then gt restack
Need to reorder PRsUse gt move
Conflicts during restackResolve conflicts, then git rebase --continue
Want to split a PRReset commits (git reset HEAD^), re-stage selectively, create new branches
Need to delete a branch (non-interactive)gt delete <branch> -f -q
gt restack hitting unrelated conflictsUse targeted git rebase <target> instead (see below)
Rebase interrupted mid-conflictCheck if files are resolved but unstaged, then git add + git rebase --continue

Advanced: Surgical Rebasing in Complex Stacks

In deeply nested stacks with many sibling branches, gt restack can be problematic:

  • It restacks ALL branches that need it, not just your stack
  • Can hit conflicts in completely unrelated branches
  • Is all-or-nothing - hard to be surgical

When to Use git rebase Instead of gt restack

Use direct git rebase when:

  • You only want to update specific branches in your stack
  • gt restack is hitting conflicts in unrelated branches
  • You need to skip obsolete commits during the rebase

Targeted Rebase Workflow

# 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 <file>
#    - 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):

  1. Check status:

    git status
    # Look for "interactive rebase in progress" and "Unmerged paths"
    
  2. Read the "unmerged" files - they may already be resolved (no conflict markers)

  3. If already resolved, just stage and continue:

    git add <resolved-files>
    git rebase --continue
    
  4. 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

Skills liên quan

readout
warpdotdev
Produce a polished, self-contained HTML "readout" document under ~/.readouts (with an auto-maintained index page), either by snapshotting the findings accumulated in the current conversation or — when invoked fresh, e.g. "/readout on how github webhook events are processed" — by sharpening scope with clarifying questions and researching the codebase before documenting. The work runs in a child agent so the main conversation's context stays clean. Use whenever the user invokes /readout, says...
prisma-next-migration-review
prisma
Review what Prisma Next migrations will run on merge or deploy, render the migration graph, resolve concurrent / diamond-convergence conflicts, and configure…
official
screenshot
openai
Chụp ảnh màn hình desktop và cửa sổ ở cấp hệ điều hành với các tùy chọn lưu linh hoạt và chọn vùng. Hỗ trợ chụp toàn màn hình, ứng dụng/cửa sổ, cửa sổ đang hoạt động và vùng pixel trên macOS, Linux và Windows. Tự động định tuyến đến vị trí chụp màn hình mặc định của hệ điều hành, đường dẫn do người dùng chỉ định hoặc thư mục tạm thời tùy theo ngữ cảnh. Bao gồm các trình trợ giúp dành riêng cho nền tảng (Python cho macOS/Linux, PowerShell cho Windows) với kiểm tra quyền trước trên macOS để giảm các lời nhắc sandbox lặp lại. Ưu tiên...
official
dbs-action
dontbesilent2025
dontbesilent 执行力诊断。用阿德勒心理学框架诊断你「知道该做什么但就是不做」的真正原因。 触发方式:/dbs-action、/action、「我知道该怎么做但就是不做」「为什么我总是拖延」 使用阿德勒心理学框架进行执行力障碍诊断。触发词:/dbs-action, "我知道该做什么但就是做不到", "为什么我总是拖延
productivityresearchcommunication
addressing-pr-review-comments
streamlit
Address all valid review comments on a PR for the current branch in the streamlit/streamlit repo. Covers both inline review comments and general PR (issue)…
official
prepare-code-freeze
nvidia
Chuẩn bị đóng băng mã NeMo Relay bằng cách tạo nhánh phát hành, cập nhật cấu hình nhánh alpha hàng đêm, nâng cấp main lên phiên bản tiếp theo và mở…
official
gh-cli
github
Tài liệu tham khảo đầy đủ về GitHub CLI cho kho lưu trữ, vấn đề, yêu cầu kéo, Actions, dự án, bản phát hành và tất cả các thao tác GitHub trên dòng lệnh. Bao gồm hơn 20 danh mục lệnh như repos, issues, PRs, workflows, projects, releases, gists, codespaces, organizations và tìm kiếm với hơn 100 lệnh con. Hỗ trợ các chế độ xác thực (đăng nhập tương tác, token, GitHub Enterprise), cấu hình qua biến môi trường và chuyển đổi nhiều tài khoản. Bao gồm lọc đầu ra JSON với jq, tùy chỉnh...
official
golang-continuous-integration
samber
Cấu hình pipeline CI/CD sử dụng GitHub Actions cho các dự án Golang — kiểm thử, linting, SAST, quét bảo mật, độ phủ mã, Dependabot, Renovate, GoReleaser, tự động hóa đánh giá mã và pipeline phát hành. Sử dụng khi thiết lập hoặc cải thiện CI cho dự án Go, cấu hình workflow GitHub Actions, thêm công cụ lint hoặc quét bảo mật, tự động hóa cập nhật phụ thuộc, hoặc thêm các rào cản chất lượng.
developmentdevopstesting