如果你每天都用 Git,Google 的 Jujutsu(JJ)可能會改寫一切
假如我告訴你:有一個由 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 里你得在三種狀態間切換:
- 工作區(working directory)
- 暫存區(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;
- 先用測試倉庫試試:
jj git clone --colocate https://github.com/jj-vcs/jj.git- 讀基礎文檔:jj help,再看看 Steve Klabnik 的教程;
- 小步試用:先在個人項目上使用,再考慮推廣到工作倉庫;
- 記住:隨時可以回到 Git 命令,兩者可在同一倉庫中并行。
有位開發者的形容很妙:
“如果說用 Git CLI 像是肩膀全速撞墻,那用 jj 就像是來了一次輕松愉悅的背部按摩。”
準備好讓你的日常版本控制也“按摩”一下了嗎?



























