假如我告诉你:有一个由 Google 开发的版本控制系统,能解决 Git 的大多数痛点,却依然完全兼容你现有的 Git 仓库,你会怎样?
大多数开发者的日常大概是:会几条顺手的 Git 命令就够活了——git add .
、git commit -m
、git push
;乱了再来一次 rebase。
你也习惯了合并冲突、理解了暂存区(staging area),而且大概已经把
git stash
打到怀疑人生。
介绍一下:JJ
Jujutsu(命令:jj
),也许会是那个让你忘掉 Git 各种“怪脾气”的工具。
JJ(Jujutsu)是什么?
它是由 Google 的软件工程师 Martin von Zweigbergk(从事源码控制)提出的一种不同思路的版本控制系统。
项目起初是 2019 年的个人兴趣,如今已成为 Google 的全职项目,目标之一是有潜力替换其内部的版本控制基础设施。
Jujutsu 使用 Git 仓库作为底层存储。

![]()
与 Git 最显著的差异
1)不再被“暂存区”困扰
在 Git 里你得在三种状态间切换:
-
暂存区(index / staging area)
- 已提交的变更(committed changes)
在 JJ 中,只有一个核心概念:一切皆提交(commit)。
你的工作副本本身就是一个提交,并会随着你的修改自动更新。
# Git 工作流
$ echo "console.log('hello');" > app.js
$ git add app.js
$ git commit -m "Add hello world"
# JJ 工作流
$ echo "console.log('hello');" > app.js
$ jj describe -m "Add hello world"
# 就这样。无需 staging。
2)stash 从此“退休”
临时要去别的分支看点东西?Git 里不是临时提交就是 stash
。 在 JJ 里,你的工作已经被自动提交,所以可以随时切换到任意提交而不用担心丢东西。
# Git:“糟糕,我得先去别处看看”
$ git stash push -m "work in progress"
$ git checkout other-branch
# do stuff...
$ git checkout my-branch
$ git stash pop
# JJ:“没问题”
$ jj edit other-commit-id
# do stuff...
$ jj edit @ # 回到刚才的位置
3)历史编辑不再焦虑
想修复“3 个提交之前”的一个小错别字? 在 Git 中,你大概率要交互式 rebase,要么冲突要么紧张。 在 JJ 里,你可以直接编辑那条提交,所有后代提交会自动 rebase。
# 想在 JJ 里修改提交 abc123?
$ jj edit abc123
# 做你的改动
$ jj describe -m "Updated commit message"
$ jj edit @ # 回到最新位置
# 所有后代提交已自动 rebase!
4)把“冲突”当一等公民
JJ 把冲突视作模型中的一等对象,而不是必须立刻处理的纯文本差异。 这意味着冲突的解决可以自动传播到后续的子提交中——复杂 rebase 时不再重复处理同一个冲突。
一次典型的 JJ 工作流
开始一个新特性
# 克隆任意 Git 仓库并开始使用 JJ
$ jj git clone --colocate git@github.com:yourname/project.git
$ cd project
# 开始新工作(会创建一个空提交)
$ jj new -m "Add user authentication"
# 修改文件——它们会被自动跟踪
$ vim auth.js
$ vim routes.js
# 随时查看进度
$ jj diff
$ jj status
# 准备下一个工作单元
$ jj new -m "Add login validation"
与“分支”协作
JJ 默认使用匿名分支(你不用给每个小改动都起名字)。 当需要推送到 GitHub 时,使用 bookmarks(书签):
# 创建一个用于 GitHub 的 bookmark
$ jj bookmark create feature-auth
# 推送到你的 Git 远端
$ jj git push
# 远端会看到一个普通的 Git 分支,名为 "feature-auth"
Change ID 的威力
在 Git 中,只要你修改提交,提交哈希就会变化; JJ 引入了稳定的 Change ID:即便你修改了提交,Change ID 仍保持不变。
$ jj log
@ abcdefgh you@email.com 2024-06-20 12:34:56 9a2b3c4d
│ Add authentication logic
○ qrstuvwx you@email.com 2024-06-20 11:30:22 5e6f7g8h
│ Initial setup
上面左侧的字母(例如 abcdefgh
)是 Change ID,编辑提交也不变。 右侧那串十六进制(如
9a2b3c4d
)是 Git 提交哈希,编辑会变化。
安装与快速上手
安装 JJ 很直接:
# macOS
$ brew install jj
# Linux(不同发行版)
$ sudo pacman -S jujutsu # Arch
$ sudo zypper install jujutsu # openSUSE
# 或从 GitHub 下载预编译二进制
在现有 Git 仓库中启用:
$ cd your-existing-git-repo
$ jj git init --colocate
--colocate
的意思是 JJ 与 Git 并行工作。 你仍然可以照常使用 Git 命令,JJ 会与这些变更保持同步。
有什么不足吗?
JJ 并不完美,你需要了解这些限制:
- 性能:在特别大的仓库上,某些操作可能比 Git 慢,团队正在持续优化。
-
生态:相较 Git,周边工具还少一些。你常用的 Git GUI 或 IDE 集成可能暂不支持 JJ。
- 学习曲线:概念更简单,但你需要改掉部分 Git 习惯,并学习新的命令。
- 临时文件:JJ 会自动快照一切,因此需要更小心
.gitignore
(避免跟踪构建产物)。
如果你不严重依赖某些 Git 专属工具或 GUI,可以这样开始:
先用测试仓库试试:
jj git clone --colocate https://github.com/jj-vcs/jj.git
读基础文档:jj help
,再看看 Steve Klabnik 的教程;
小步试用:先在个人项目上使用,再考虑推广到工作仓库;
记住:随时可以回到 Git 命令,两者可在同一仓库中并行。
有位开发者的形容很妙:
“如果说用 Git CLI 像是
肩膀全速撞墙,那用 jj
就像是来了一次轻松愉悦的背部按摩。”
准备好让你的日常版本控制也“按摩”一下了吗?
好啦,今天的内容分享就到这,感觉不错的同学记得分享点赞哦!PS:程序员好物馆 持续分享程序员学习、面试相关干货,不见不散!