关于 using-jj
面向 jj 的工作流技能,涵盖变更描述、匿名变更、拆分、压缩、历史恢复及 GitHub 拉取请求操作。它提供命令示例,并说明常见的修订版本和书签陷阱。
主要功能
- 01jj 变更描述规范
- 02拆分、压缩、编辑与吸收流程
- 03书签和推送指引
- 04GitHub 拉取请求操作
- 05操作与变更历史恢复
- 06Revset 命令示例
适用场景
- 01整理 jj 变更中的工作
- 02在变更栈中应用修复
- 03推送变更并创建 GitHub 拉取请求
- 04恢复仓库的先前状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trevors/ dot-claude --skill using-jj安装后在 Claude Code 中输入/using-jj确认已加载。
附带文件evals/trigger-eval.jsonREFERENCE.md
详细介绍
jj 工作流
表格、Git 对应项、故障排查和 revset 速查表:REFERENCE.md。
文风规范
- 必须填写描述。 绝不能让工作副本处于“(no description set)”状态。
- 书签是为 GitHub 准备的,不是为你准备的。 使用匿名变更;仅在推送时添加书签。
- 优先使用
absorb,而不是手动路由 squash。 让 jj 将代码块分配给正确的祖先。
非交互式拆分
jj split 需要同时指定文件集和 -m:
jj split -r <rev> -m "first part" path/a path/b # rest stays in the child commit
Evolog 寻址
先前版本:<change-id>/0(最新),/1(上一个)。jj restore --from xyz/1 --into xyz 可还原到先前状态。
工作流
Squash(推荐)
jj describe -m "feat: what I'm building"
jj new -m "wip"
# ... make changes ...
jj squash -m "feat: done"
Edit(修复堆栈中间的变更)
jj edit <change-id>
# ... fix ...
jj new -m "back to work" # descendants auto-rebased
Absorb
在 @ 上运行 jj absorb,它会将每个代码块路由到最后修改这些行的祖先。
书签与推送
书签不会自动前移——需要显式移动。将书签指向实际包含这些工作内容的修订,具体取决于你刚才使用的工作流:
jj bookmark set <name> -r @- # after `jj squash`/`jj commit`: @ is a fresh empty change
jj bookmark set <name> -r @ # after `jj describe -m` alone: @ IS the work
jj git push
如果弄错了,不会有任何提示:当工作内容位于 @ 时推送 @-,发布的会是上一个提交。
不要改写已评审 PR 的历史
默认方式(安全——保留评论锚点):
jj new feature-x -m "fixup: address feedback"
# ... make changes ...
jj bookmark set feature-x -r @
jj git push
jj new feature-x(末尾不带 -)会将修复堆叠在书签之上。
feature-x- 是 feature-x 的父版本 的 revset,因此它会从已评审提交分出一个平行分支,而 bookmark set -r @- 随后会将书签向后移动,丢弃评审者添加批注的那个提交。
创建 PR(jj + gh)
在 jj-colocated 仓库中,git HEAD 处于分离状态——gh pr create 会因“not on any branch”而失败。始终传入 --head <bookmark>——绝不要依赖 git 自动检测:
jj bookmark set feature-x -r @- # or -r @ — see "Bookmarks & pushing" above
jj git push
gh pr create --head feature-x --title "..." --body "..."
恢复
运行 jj op log,然后运行 jj op restore <id>;jj evolog -r <change-id> 会显示单个变更的历史。完整说明见 REFERENCE.md。
不可变提交
已推送的提交受 immutable_heads() 保护。jj squash --into <id> --ignore-immutable 是将修复折叠进已推送提交的批准方式;rules/pr-safety.md 仍会根据 PR 是否已评审来决定是否允许这样做。
Revsets
jj log -r 'trunk()..@' # everything between main and here
jj log -r '::@ & ~::trunk()' # my branch only
jj log -r 'mine()' # my commits
jj log -r 'author(substring:"trevor")' # bare strings in author()/description() are whole-string globs; say substring: for partial