对抗知识焦虑,从看懂这条开始
App 下载对抗知识焦虑,从看懂这条开始
App 下载
冲突管理|历史编辑|版本控制工具|Martin von Zweigbergk|Jujutsu|软件工程|前沿科技
想象一下:你写代码时不用再反复输入git add,不用在切换分支前慌忙stash未完成的修改,改坏了历史提交能一键撤销,遇到冲突还能先放一边去做别的事——这不是科幻,是Google工程师Martin von Zweigbergk开发的Jujutsu(简称jj)正在做的事。
作为一款分布式版本控制系统,jj兼容所有Git仓库,却把Git最让人头疼的复杂操作给拆得干干净净。更离谱的是,它在简化的同时,还实现了Git做不到的灵活历史编辑和冲突管理。为什么一款后起之秀能打破「强大必然复杂」的铁律?这得从Git的天生缺陷说起。
要理解jj的创新,得先搞懂Git为什么难用——它的核心痛点,是人为制造了太多「中间态」。
你可以把Git的工作流想象成一个三层货架:底层是仓库里的历史提交,中间是「暂存区」,顶层是你的工作目录。每次修改代码,你得先把文件从顶层搬到中间层(git add),再从中间层搬到底层(git commit)。要是想切换分支,还得把顶层没搬完的东西塞进「储藏间」(git stash),不然就会丢东西。

这个三层模型是Git为了灵活拆分提交设计的,但对90%的普通开发者来说,它更像一套冗余的枷锁:有人会忘记git add导致提交不全,有人会在stash后再也找不到那堆代码,还有人在变基时被冲突逼到崩溃——Git要求你必须立刻解决冲突,不然整个流程就卡在这里。
jj直接拆掉了中间层和储藏间:你的工作目录就是一个实时更新的提交,所有修改自动被记录,不用手动「暂存」;想拆分提交可以事后用jj split灵活切割;切换分支时,未完成的修改会自动变成一个独立的提交,根本不用「储藏」。

jj的强大,不在于增加了多少新功能,而在于把Git里需要手动操作的复杂流程,变成了工具自动处理的「隐形规则」。
最核心的创新是「变更集ID」和「提交ID」的分离:Git里的提交是不可变的快照,改一次提交就会生成一个新的哈希值,后续的变基、合并全靠这个哈希值关联,一旦出错就会导致整个提交链断裂。而jj里,每个逻辑上的修改对应一个稳定的「变更集ID」,哪怕你反复修改提交内容,这个ID都不会变;底层的提交哈希值变化时,jj会自动把后续所有提交重新关联上去——你不用再手动执行复杂的变基命令,工具会帮你搞定一切。

冲突处理更是颠覆性的:Git把冲突当成必须立刻解决的错误,而jj把冲突当成一种可以被记录的「状态」。变基时遇到冲突,jj会先完成操作,把冲突标记在提交里,你可以先去做别的任务,等有空了再回来解决;解决完冲突后,jj还会自动把解决方案同步到所有相关的提交里,不用你反复处理相同的冲突。
还有被开发者吹爆的「操作日志」:jj会记录你在仓库里的每一次操作——提交、合并、变基、甚至撤销操作本身。你可以用jj undo一键回退到任意操作之前的状态,再也不用对着Git的reflog一脸茫然地找历史记录。
当然,jj也不是完美的:它的标签管理还不完善,和VS Code等IDE的集成度不如Git,对Git子模块的支持也还在开发中。但这些问题,都不妨碍它成为Git用户的「无痛升级选项」。
jj最聪明的地方,是它从一开始就没打算「取代Git」,而是做Git的「前端壳」。
它用Rust写的gitoxide库直接对接Git的底层存储格式,你可以在现有Git仓库里用jj git init --colocate一键启用jj,同时保留.git目录。这意味着你可以自己用jj享受简洁的操作,团队里的其他人依然用Git,完全不影响协作;哪天你不想用jj了,直接切回Git就行,所有历史记录都不会丢。
这种「渐进式替代」的策略,解决了新工具推广的最大难题——不用说服整个团队改变习惯。Google内部已经有900多名开发者在用jj管理大型代码库,Mozilla在从Mercurial迁移到Git的过程中,也用jj作为过渡工具,既满足了老用户的操作习惯,又兼容了Git的生态。
在版本控制领域,「兼容性」从来都是比「创新性」更重要的护城河。Git当年能打败Mercurial,很大程度上是因为它兼容了Linux内核的现有工作流;而jj能快速获得认可,也是因为它踩在了Git的肩膀上——站在巨人的肩膀上,却拆掉了巨人身上的枷锁。
从Subversion到Git,再到今天的jj,版本控制系统的进化史,其实就是一部「如何把复杂留给工具,把简单还给人」的历史。Git的出现,解决了分布式协作的问题,但也把复杂的操作逻辑丢给了开发者;而jj的创新,是重新思考了「开发者真正需要什么」——不是更多的功能,而是更少的麻烦。
好的工具,是让你忘记工具的存在。 当你不用再为「要不要stash」「有没有add文件」操心,当你可以专注于代码本身时,工具才算完成了它的使命。jj的出现,不仅是给Git用户提供了一个新选项,更给整个行业提了个醒:强大和复杂,从来都不是绑定在一起的——只要找对了方向,简洁的工具一样可以很强大。