gt
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGraphite
Graphite
Overview
概述
Graphite (gt) is a CLI tool for managing stacked pull requests - breaking large features into small, incremental changes built on top of each other. This skill provides the mental model, command reference, and workflow patterns needed to work effectively with gt.
Graphite(gt)是一款用于管理堆叠式拉取请求的CLI工具——将大型功能拆分为多个基于彼此构建的小型增量变更。本技能提供了有效使用gt所需的核心思维模型、命令参考和工作流模式。
CRITICAL: Always Use --no-interactive
--no-interactive重要提示:始终使用--no-interactive
--no-interactiveNEVER invoke any command without . This is a global flag inherited by every gt command — not a per-command option.
gt--no-interactiveWithout , gt may open prompts, pagers, or editors that hang indefinitely in agent/CI contexts. The flag does NOT prevent prompts — you must use separately.
--no-interactive--force--no-interactivebash
undefined**绝对不要在不添加的情况下调用任何命令。**这是所有gt命令都继承的全局标志——而非针对单个命令的选项。
--no-interactivegt如果不添加,gt可能会在Agent/CI环境中打开提示、分页器或编辑器,导致进程无限挂起。标志无法阻止提示——你必须单独使用。
--no-interactive--force--no-interactivebash
undefinedWRONG - may hang waiting for user input
错误示例 - 可能会因等待用户输入而挂起
gt sync
gt submit --force
gt track --parent main
gt sync
gt submit --force
gt track --parent main
CORRECT - always pass --no-interactive
正确示例 - 始终添加--no-interactive
gt sync --no-interactive
gt submit --no-interactive
gt track --parent main --no-interactive
gt restack --no-interactive
gt create my-branch -m "message" --no-interactive
**What `--interactive` controls (all disabled by `--no-interactive`):**
- Prompts (confirmation dialogs in sync, delete, submit, etc.)
- Pagers (output paging in log)
- Editors (commit message editing in create/modify, PR metadata in submit)
- Interactive selectors (branch selection in checkout, move, track)
**Note:** `gt modify --interactive-rebase` is a separate, unrelated flag that starts a git interactive rebase. It is NOT the same as the global `--interactive`.gt sync --no-interactive
gt submit --no-interactive
gt track --parent main --no-interactive
gt restack --no-interactive
gt create my-branch -m "message" --no-interactive
**`--interactive`的控制范围(添加`--no-interactive`后会全部禁用):**
- 提示(同步、删除、提交等操作中的确认对话框)
- 分页器(日志输出的分页功能)
- 编辑器(创建/修改时的提交消息编辑、提交时的PR元数据编辑)
- 交互式选择器(切换、移动、跟踪操作中的分支选择)
**注意:** `gt modify --interactive-rebase`是一个独立的、不相关的标志,用于启动git交互式变基。它与全局的`--interactive`不是同一概念。Core Mental Model
核心思维模型
Stacks are Linear Chains
栈是线性链
A stack is a sequence of branches where each branch (except trunk) has exactly one parent:
VALID STACK (linear):
main → feature-a → feature-b → feature-c
INVALID (not a stack):
main → feature-a → feature-b
└─────→ feature-x栈是一系列分支的序列,其中每个分支(除主干外)恰好有一个父分支:
有效栈(线性):
main → feature-a → feature-b → feature-c
无效栈(非线性):
main → feature-a → feature-b
└─────→ feature-xKey Concepts
关键概念
- Parent-Child Relationships: Every branch tracked by gt (except trunk) has exactly one parent branch it builds upon
- Auto-restacking: When modifying a branch, gt automatically rebases all upstack branches to include changes
- Directional Navigation:
- Downstack/Down: Toward trunk (toward the base) - moves from feature-b → feature-a → main
gt down - Upstack/Up: Away from trunk (toward the tip) - moves from feature-a → feature-b → feature-c
gt up
- Downstack/Down: Toward trunk (toward the base) -
- Trunk: The main branch (usually or
main) that all stacks build uponmaster
- 父子关系:所有被gt跟踪的分支(除主干外)都有一个它所基于的父分支
- 自动重排栈:当修改一个分支时,gt会自动对所有上游分支执行变基以包含变更
- 定向导航:
- 下游(Downstack/Down): 朝向主干(基础方向) - 从feature-b跳转到feature-a再到main
gt down - 上游(Upstack/Up): 远离主干(顶端方向) - 从feature-a跳转到feature-b再到feature-c
gt up
- 下游(Downstack/Down): 朝向主干(基础方向) -
- 主干(Trunk): 所有栈所基于的主分支(通常为或
main)master
Stack Visualization - CRITICAL MENTAL MODEL
栈可视化 - 核心思维模型
When working with Graphite stacks, always visualize trunk at the BOTTOM:
TOP ↑ feat-3 ← upstack (leaf)
feat-2
feat-1
BOTTOM ↓ main ← downstack (trunk)使用Graphite栈时,始终要将主干想象在底部:
顶端 ↑ feat-3 ← 上游(叶子节点)
feat-2
feat-1
底部 ↓ main ← 下游(主干)Directional Terminology - MUST UNDERSTAND
定向术语 - 必须理解
- UPSTACK / UP = away from trunk = toward TOP = toward leaves
- DOWNSTACK / DOWN = toward trunk = toward BOTTOM = toward main
- UPSTACK / UP = 远离主干 = 朝向顶端 = 朝向叶子节点
- DOWNSTACK / DOWN = 朝向主干 = 朝向底部 = 朝向main
Detailed Examples
详细示例
Given stack:
main → feat-1 → feat-2 → feat-3If current branch is :
feat-1- Upstack: ,
feat-2(children, toward top)feat-3 - Downstack: (parent, toward bottom)
main
If current branch is (at top):
feat-3- Upstack: (nothing, already at top/leaf)
- Downstack: ,
feat-2,feat-1(ancestors, toward bottom)main
给定栈结构:
main → feat-1 → feat-2 → feat-3如果当前分支是:
feat-1- 上游:,
feat-2(子分支,朝向顶端)feat-3 - 下游:(父分支,朝向底部)
main
如果当前分支是(位于顶端):
feat-3- 上游:(无内容,已处于顶端/叶子节点)
- 下游:,
feat-2,feat-1(祖先分支,朝向底部)main
Why This Mental Model Is Critical
为何此思维模型至关重要
🔴 Commands depend on this visualization:
- /
gt upnavigate the stackgt down - traverses branches in specific direction
land-stack - Stack traversal logic (parent/child relationships)
🔴 Common mistake: Thinking "upstack" means "toward trunk"
- WRONG: upstack = toward main ❌
- CORRECT: upstack = away from main ✅
🔴 PR landing order: Always bottom→top (main first, then each layer up)
🔴 命令依赖于这种可视化逻辑:
- /
gt up用于导航栈gt down - 按特定方向遍历分支
land-stack - 栈遍历逻辑(父子关系)
🔴 常见误区: 认为“上游”是“朝向主干”
- 错误:上游 = 朝向main ❌
- 正确:上游 = 远离main ✅
🔴 PR合并顺序: 始终从下到上(先main,然后依次向上每层)
Metadata Storage
元数据存储
All gt metadata is stored in the shared directory (accessible across worktrees):
.git- - Repository-level configuration (trunk branch)
.git/.graphite_repo_config - - Branch relationships (parent-child graph)
.git/.graphite_cache_persist - - Cached GitHub PR information
.git/.graphite_pr_info
Important: Metadata is shared across all worktrees since it's in the common directory.
.git所有gt元数据都存储在共享的目录中(可跨工作树访问):
.git- - 仓库级配置(主干分支)
.git/.graphite_repo_config - - 分支关系(父子图)
.git/.graphite_cache_persist - - 缓存的GitHub PR信息
.git/.graphite_pr_info
重要提示:由于元数据存储在公共的目录中,因此它会在所有工作树之间共享。
.gitEssential Commands
必备命令
Remember: ALL gt commands below must include (see CRITICAL: Always Use above).
--no-interactive--no-interactive记住:以下所有gt命令都必须添加(参见上方重要提示:始终使用部分)。
--no-interactive--no-interactiveCommon Workflow Commands
常见工作流命令
| Command | Alias | Purpose |
|---|---|---|
| | Create new branch stacked on current branch and commit staged changes |
| | Modify current branch (amend commit) and auto-restack children |
| | Push branches and create/update PRs |
| | Submit entire stack (up + down) |
| - | Sync from remote and prompt to delete merged branches |
| 命令 | 别名 | 用途 |
|---|---|---|
| | 创建基于当前分支的新分支,并提交暂存的变更 |
| | 修改当前分支(修正提交)并自动重排上游子分支 |
| | 推送分支并创建/更新PR |
| | 提交整个栈(上游+下游) |
| - | 从远程同步,并提示删除已合并的分支 |
Navigation Commands
导航命令
| Command | Alias | Purpose |
|---|---|---|
| | Move up stack (away from trunk) |
| | Move down stack (toward trunk) |
| | Move to tip of stack |
| | Move to bottom of stack |
| | Interactive branch checkout |
| 命令 | 别名 | 用途 |
|---|---|---|
| | 向上游导航栈(远离主干) |
| | 向下游导航栈(朝向主干) |
| | 跳转到栈的顶端 |
| | 跳转到栈的底部 |
| | 交互式切换分支 |
Stack Management
栈管理
| Command | Purpose |
|---|---|
| Ensure each branch has its parent in git history |
| Rebase current branch onto different parent |
| Fold branch's changes into parent |
| Split current branch into multiple single-commit branches |
| Visualize stack structure |
| 命令 | 用途 |
|---|---|
| 确保每个分支的父分支都在git历史中 |
| 将当前分支变基到不同的父分支上 |
| 将分支的变更合并到父分支中 |
| 将当前分支拆分为多个单提交分支 |
| 可视化栈结构 |
Branch Info & Management
分支信息与管理
| Command | Purpose |
|---|---|
| Show branch info (parent, children, commit SHA) |
| Show parent branch name |
| Show children branch names |
| Start tracking branch with gt (set parent) |
| Stop tracking branch with gt |
| Delete branch and update metadata |
| Rename branch and update metadata |
| 命令 | 用途 |
|---|---|
| 显示分支信息(父分支、子分支、提交SHA) |
| 显示父分支名称 |
| 显示子分支名称 |
| 开始用gt跟踪分支(设置父分支) |
| 停止用gt跟踪分支 |
| 删除分支并更新元数据 |
| 重命名分支并更新元数据 |
Workflow Patterns
工作流模式
Pattern 1: Creating a New Stack
模式1:创建新栈
Build a feature in multiple reviewable chunks:
bash
undefined将功能拆分为多个可评审的小块:
bash
undefined1. Start from trunk
1. 从主干开始
gt checkout main --no-interactive
git pull
gt checkout main --no-interactive
git pull
2. Create first branch
2. 创建第一个分支
gt create phase-1 -m "Add API endpoints" --no-interactive
gt create phase-1 -m "Add API endpoints" --no-interactive
... make changes ...
... 进行变更 ...
git add .
gt modify -m "Add API endpoints" --no-interactive
git add .
gt modify -m "Add API endpoints" --no-interactive
3. Create second branch on top
3. 在顶部创建第二个分支
gt create phase-2 -m "Update frontend" --no-interactive
gt create phase-2 -m "Update frontend" --no-interactive
... make changes ...
... 进行变更 ...
git add .
gt modify -m "Update frontend" --no-interactive
git add .
gt modify -m "Update frontend" --no-interactive
4. Submit entire stack
4. 提交整个栈
gt submit --stack --no-interactive
gt submit --stack --no-interactive
Result: 2 PRs created
结果:创建2个PR
PR #101: phase-1 (base: main)
PR #101: phase-1(基础:main)
PR #102: phase-2 (base: phase-1)
PR #102: phase-2(基础:phase-1)
undefinedundefinedPattern 2: Responding to Review Feedback
模式2:响应评审反馈
Update a branch in the middle of a stack:
bash
undefined更新栈中间的某个分支:
bash
undefinedNavigate down to target branch
导航到目标分支
gt down --no-interactive # Repeat as needed
gt down --no-interactive # 根据需要重复执行
Make changes
进行变更
... edit files ...
... 编辑文件 ...
git add .
git add .
Modify (auto-restacks upstack branches)
修改分支(自动重排上游子分支)
gt modify -m "Address review feedback" --no-interactive
gt modify -m "Address review feedback" --no-interactive
Resubmit stack
重新提交栈
gt submit --stack --no-interactive
undefinedgt submit --stack --no-interactive
undefinedPattern 3: Adding to Existing Stack
模式3:向现有栈中添加内容
Insert a new branch in the middle:
bash
undefined在栈中间插入新分支:
bash
undefinedCheckout the parent where you want to insert
切换到要插入位置的父分支
gt checkout phase-1 --no-interactive
gt checkout phase-1 --no-interactive
Create new branch with --insert
使用--insert创建新分支
gt create phase-1.5 --insert -m "Add validation" --no-interactive
gt create phase-1.5 --insert -m "Add validation" --no-interactive
Submit new PR
提交新PR
gt submit --no-interactive
undefinedgt submit --no-interactive
undefinedPattern 4: Syncing After Merges
模式4:合并后同步
Clean up after PRs merge on GitHub:
bash
undefined在GitHub上合并PR后清理本地环境:
bash
undefinedRun sync (--no-interactive auto-confirms branch deletion)
执行同步(--no-interactive会自动确认分支删除)
gt sync --no-interactive
gt sync --no-interactive
Result:
结果:
- Merged branches deleted locally
- 已合并的分支被本地删除
- Remaining branches rebased onto trunk
- 剩余分支被变基到主干
- PR bases updated on GitHub
- GitHub上的PR基础分支被更新
undefinedundefinedPattern 5: Splitting Large Changes
模式5:拆分大型变更
Break up a large commit into reviewable pieces:
bash
undefined将大型提交拆分为多个可评审的部分:
bash
undefinedCheckout branch with large commit
切换到包含大型提交的分支
gt checkout large-feature --no-interactive
gt checkout large-feature --no-interactive
Split into single-commit branches
拆分为多个单提交分支
gt split --no-interactive
gt split --no-interactive
Rename branches meaningfully
给分支赋予有意义的名称
gt rename add-api-endpoints --no-interactive
gt up --no-interactive
gt rename add-frontend --no-interactive
gt up --no-interactive
gt rename add-tests --no-interactive
gt rename add-api-endpoints --no-interactive
gt up --no-interactive
gt rename add-frontend --no-interactive
gt up --no-interactive
gt rename add-tests --no-interactive
Submit
提交
gt submit --stack --no-interactive
undefinedgt submit --stack --no-interactive
undefinedCommon Mistakes to Avoid
需避免的常见错误
-
Don't usedirectly: Use
git rebaseorgt modify- gt needs to update metadata during rebasinggt restack -
Don't delete branches with: Use
git branch -d- metadata needs to be updated to re-parent childrengt delete -
Don't assumeonly affects current branch: It submits downstack too (all ancestors). Use
gt submitto include upstackgt submit --stack -
Don't forget toafter merges: Stale branches accumulate and metadata gets outdated
gt sync -
⚠️ NEVER usefor branch status: The output format is counterintuitive and confuses agents. Use
gt log short,gt branch info, orgt parentfor explicit metadata access insteadgt children
-
不要直接使用:使用
git rebase或gt modify——gt需要在变基过程中更新元数据gt restack -
不要用删除分支:使用
git branch -d——需要更新元数据来重新设置子分支的父分支gt delete -
不要假设只影响当前分支:它也会提交下游分支(所有祖先分支)。使用
gt submit来包含上游分支gt submit --stack -
合并后不要忘记执行:过时的分支会堆积,元数据也会失效
gt sync -
⚠️ 绝对不要用查看分支状态:输出格式违反直觉,会混淆Agent。请改用
gt log short、gt branch info或gt parent来明确获取元数据gt children
Quick Decision Tree
快速决策树
When to use gt commands:
- Start new work → (sets parent relationship)
gt create - Edit current branch → (auto-restacks children)
gt modify - Navigate stack → (move through chain)
gt up/down/top/bottom - View structure → (see visualization)
gt log - Get parent branch → (parse "Parent:" line)
gt branch info - Get branch relationships → /
gt parent(quick access)gt children - Submit PRs → (create/update all PRs)
gt submit --stack - After merges → (clean up + rebase)
gt sync - Reorganize → (change parent)
gt move - Combine work → (merge into parent)
gt fold - Split work → (break into branches)
gt split
何时使用gt命令:
- 开始新工作 → (设置父子关系)
gt create - 编辑当前分支 → (自动重排子分支)
gt modify - 导航栈 → (在链中跳转)
gt up/down/top/bottom - 查看结构 → (查看可视化图)
gt log - 获取父分支 → (解析“Parent:”行)
gt branch info - 获取分支关系 → /
gt parent(快速访问)gt children - 提交PR → (创建/更新所有PR)
gt submit --stack - 合并后 → (清理+变基)
gt sync - 重新组织 → (修改父分支)
gt move - 合并工作 → (合并到父分支)
gt fold - 拆分工作 → (拆分为多个分支)
gt split
Resources
资源
references/
references/
Contains detailed command reference and comprehensive mental model documentation:
- - Complete command reference, metadata format details, and advanced patterns
gt-reference.md
Load this reference when users need detailed information about specific gt commands, metadata structure, or complex workflow scenarios.
包含详细的命令参考和全面的思维模型文档:
- - 完整的命令参考、元数据格式细节和高级模式
gt-reference.md
当用户需要特定gt命令、元数据结构或复杂工作流场景的详细信息时,可加载此参考文档。