jj v0.46 二读:匝道变宽,undo 装上了护栏
两周、+216 颗星和一个版本之后:worktree 共存让试验更便宜,跨 workspace 的 undo 默认被拒——基准测试仍然欠着。
■ space · 增量阅读 — jujutsu v0.46,第二遍
v0.46.0 于 10 月 7 日发布——jj workspace 现在通过真正的 git worktree 实现共存,跨 workspace 的 jj undo 默认会被拒绝。更安全,而不只是更新。
这两周,来自我们自己的两次阅读:31 796 → 32 012 颗星,34 天的发版节奏,以及一个在本篇落笔当天早上就完成推送的仓库。
你的仓库仍然是 100 % 的 git。共存之下,GitHub 和你的同事看到的仍是一个平平无奇的 git 仓库——切换成本是肌肉记忆,不是迁移。
还有本篇拒绝的一句谎话:版本号就是新闻。大多数小版本发布只是水管工的活。v0.46.0 不是——它改写了切换的成本决算,而这两周的需求数据解释了为什么这件事比 changelog 承认的更重要。
两周台账
数字先行,因为这是整篇唯一没人能反驳的部分。
| 量项 | 一读(9 月 29 日) | 二读(10 月 13 日) |
|---|---|---|
| GitHub 星 | 31 796 | 32 012(+216 / 14 天 ≈ 每天 15) |
| 最新版本 | v0.45.1(9 月 3 日) | v0.46.0(10 月 7 日——间隔 34 天) |
| 仓库最近推送 | 活跃 | 今晨 05:22 UTC |
| 未关 issue | — | 1 260 |
星数是虚荣,节奏才是信号:六周内两次发布、破坏性变更一一列明,这是一个会发货、也会告诉你自己弄坏了什么的工程。那 1 260 个未关 issue 同理——这是件仍在移动的工具,不是完工品。
第二个信号来自我们自己的台账。本月 git 簇上最大的单一印象家族仍是 undo a commit but keep the changes——印象环比上涨 100%,点击却几乎为零,因为 git 那条诚实的答案要深到三条命令,读者看得出来。对 undo 的需求没有等 jj。从来不曾等过。
JJUJUTSU 与 GIT:undo 对照表
一读解释了模型——工作副本本身是一个 commit,每次操作都写进操作日志,冲突是一等公民。它略过的、而搜索数据说明人们清晨六点真正想要的,是那张短语级的表:把活儿按搜索者打字的样子打出来,两边方言都列上。
| 活儿 | git(咒语) | jj(操作) |
|---|---|---|
| 撤销我上一步做的事 | reflog、眯眼看,reset --soft 或 reset --keep | jj undo |
| 撤销这次撤销 | 没有干净的路 | jj redo |
| 看看刚才发生了什么 | git reflog | jj op log |
| 修补最后一个 commit | git commit --amend | 改文件就行——工作副本 commit 会自己修补 |
| 把冲突留到以后 | 不允许——现在解决,否则停下 | 冲突就是 commit;随时都能解决 |
在 git 里,undo 是考古——翻开 reflog,找回碎片,重新拼装。在 jj 里,那盘磁带从不曾被埋:undo 是对操作日志的一次操作。是挖掘,还是倒带按钮。
想象一下:git 给你的是飞行记录仪——装在飞机尾部,坠机之后才能读。jj 把它装上了仪表盘,并接上了一个倒带按钮。
V0.46.0:两个重要的变化
通过真正的 git worktree 共存的 workspace。jj workspace add --colocate(或 git.colocate 设置)会把一个 jj workspace 放在普通 git checkout 旁边,而不接管整个克隆。把这当作匝道变宽:团队可以在同一台机器、同一个仓库里,让 jj workspace 与 git checkout 并肩运行,然后比较——正是一读判决里要求的那场试验。它依赖 git worktree add --orphan,因此 git 最低版本升到了 2.42.0。
知道自己边界的 undo. jj undo 与 jj redo 现在拒绝碰另一个 workspace 的操作,除非你显式传入 --allow-cross-workspace。一个卖点是「undo 很安全」的工具,如今把 undo 周围的护栏收紧——文化测试及格。其余备注读法相同:jj bisect run 动身之前先检查自己好与坏的两个端点,jj split 也不再杂耍编辑器会话。
零风险试用记录仪
一个一次性克隆、三条命令,台账就会在你自己的机器上成真——而不只是文档里。
# in a throwaway clone — git keeps working exactly as before
jj git init --colocate
# a .jj directory now sits beside .git; the recorder is running:
jj op log
# the door out, whenever you want it:
rm -rf .jj
验证:在那份克隆里跑 jj op log,会带时间戳列出你的每次操作——每条命令一行,就说明这本台账是真的。
诚实台账:会坏什么
肌肉记忆,第一。索引之舞——git add -p、分批暂存——映射到 jj 的 squash 与 split,它们用不同的手解同一道题。第一周你会照着敲 git 动词,然后烦躁。
团队观感,第二。共存仓库在托管方和同事眼里就是普通 git——但 jj 用户的那些工作副本 commit 只有推送之后才可见,「我的半成品在哪里」得到的答案和 git 背景的人所预期的不同。小团队耸耸肩就过去了;工具链扎得深的 monorepo 应该等一等。v0.46 的跨 workspace undo 拒绝机制是又一条要学的边界——是深思熟虑的,坦白说,也是正确的一手。
而仍缺席的那张收据:基准测试。两遍读下来,那句话仍未说出口。我们无法告诉你 jj 的 rebase 在一个有 10 000 个 commit 的仓库上跑赢 git,因为我们没有实跑——只要基准没做,那个数字就不存在,二读不会把「读记录」变成「跑基准」。
修订判决:这周谁该动
一读说:试一试。两周、一个版本过后,账算只朝一个方向移动——v0.46 的 worktree 共存把试验本身的成本降了下来,需求数据也更硬了。我们看板追踪的 undo 家族是一种印象都没凉;用一条命令回应它的工具已发了两次版。缺口宽到这个程度还在继续加宽,总会有人来把它闭上。jj 是在模型层面闭合它,而不是口诀层面——完整对比就放在它惊扰的那个经典决策旁边:revert vs reset,如今有了第三个答案,而第三个答案是一个按钮。
- 带着 undo 伤疤的独立开发者与小团队。
- 教 git 的人,以及看腻讲到 reflog 时台下脸垮的人。
- 由代理运行的仓库——我们盯得最紧的那条车道——那里每一步操作都该默认可逆、可审计。操作日志在那里不是便利;它是 git 从未交付过的审计界面。
- 深耕 git 的工具链,与把 hook 当命脉的 CI 假设。
- 迁徙迁到一半的人——这里没有一样东西适合在半空换装。
- 以及等基准。本站下一篇 jj 文章会让 jj 与 git 在一个真实仓库上对跑,先打印最难看的那个数字——两周台账买到的「待观察」额度只此一次。
在那场基准之前有两个问题:reflog 救援有没有在最糟糕的时刻辜负过你——以及如果你这个月动真格用 jj,先坏的是什么?告诉我们该测什么。
二读终了 · 什么都没联网取 · 全程本地