简介
Jujutsu 是一个功能强大的 版本控制系统 (version control system),适用于各种软件项目。你可以用它来获取代码副本、追踪代码更改,最后将更改发布给他人查看和使用。
它从头开始就被设计得非常易用 —— 无论你是新手还是经验丰富的开发者,无论你是独自开发一个新项目,还是参与具有庞大历史记录和大型团队的大型软件项目,Jujutsu 都能帮你轻松上手。
Jujutsu 与大多数其他系统不同,它在内部将用户界面和版本控制算法与用来存储内容的 存储系统 分离。这使得它可以作为一个支持多种物理后端的 VCS(版本控制系统),这些后端可能有自己的数据或网络模型 —— 比如 Mercurial、Breezy,或者像 Google 基于云的混合系统 Piper/CitC。
目前,我们使用 Git 仓库作为存储层来提供和追踪内容,这让它 现在就能兼容你喜欢的许多基于 Git 的工具! 所有核心开发者都是使用 Jujutsu 来开发 Jujutsu 的,就在 GitHub 上。不过,它应该也能与你喜欢的 Git 代码托管平台一起使用。
Jujutsu 融合了来自其他版本控制系统的许多独特设计理念与概念,并将它们整合进一个工具中。其中一些灵感来源包括:
Git:我们努力做到 快速 —— 提供流畅的用户体验、高效的算法、正确的数据结构,以及对细节的精细打磨。默认的存储后端使用 Git 仓库来做“物理存储”,以实现广泛的互通性和低门槛的上手体验。
Mercurial 和 Sapling:Jujutsu 借鉴了 Mercurial 的许多特性,例如用于选择提交的 revset 语言。它没有显式的 index(索引)或 staging area(暂存区)。分支是“匿名”的,类似 Mercurial,你不必为每一个小改动都取一个名字。修改历史的操作既强大又简单。输出格式使用的是一个健壮、用户可配置的模板语言。
Darcs:在 Jujutsu 中,冲突被视为 一等公民对象,就像提交一样。而 Git 等系统只是把冲突当作文本差异来看。虽然 Jujutsu 没有像 Darcs(基于形式化的 patch 理论,而不是 snapshot 快照)那样严谨,但这种处理方式使得很多冲突的解决过程可以自动完成并传播下去。
此外,Jujutsu 还加入了一些创新且实用的功能:
工作区即提交(working-copy-as-a-commit):对文件的更改会被 自动记录为普通提交,并在每次更改后进行修订。这种“快照”设计简化了用户可见的数据模型(提交是唯一可见对象),也简化了内部算法,并完全替代了 Git 的 stash 或 index/staging-area 功能。
操作日志和撤销功能(operation log & undo):Jujutsu 会记录对仓库执行的每一项操作,比如提交、拉取、推送等。这让你更容易排查“刚刚发生了什么?”或“我是怎么变成这样的?”这些问题 —— 特别是在帮同事解决这些问题时。而且因为所有操作都有记录,你可以轻松撤销刚刚犯下的错误。版本控制终于进入了 20 世纪 60 年代!
自动 rebase 和冲突传播:当你修改了一个提交,它的所有子提交都会自动 rebase 到新提交上。这使得“基于补丁的工作流”变得非常轻松。如果你在一个提交中解决了冲突,该冲突的 解决方式 也会自动传播到其子提交中。换句话说,这相当于把
git rebase --update-refs
和git rerere
融为一体,并从设计层面就原生支持。
⚠️ 警告:以下功能可以使用,但仍属实验性特性,可能包含 bug、不兼容的存储格式变动或用户界面变化。
- 安全的并发复制(Safe, concurrent replication):你是否曾想过把你的版本控制仓库存储在 Dropbox 目录下?或者实时备份到 S3?没有?那现在你可以了!
使用像 Dropbox 这类文件系统或 rsync 这类备份工具处理 Git/Mercurial 仓库的根本问题在于:这些工具依赖 本地文件系统操作 是原子性的、串行的、不会和其他读写操作并发冲突 —— 而这些条件在分布式文件系统或备份时并不成立。
Jujutsu 则被设计为 支持并发场景下的安全性,你只需用 rsync 或 Dropbox 同步仓库,然后使用它,就不会导致仓库损坏。最糟糕的情况也只是暴露本地和远程之间的冲突,留给你来解决。
命令行工具目前被称为 jj
,因为这个名字易于输入、也很少见(在英文中)。项目名称叫 “Jujutsu”,正好与 jj
对应。
Jujutsu 还是一个相对年轻的项目,还有很多工作要做。如果你有任何问题,或想聊聊未来的计划,欢迎加入我们的 Discord 群聊,发起一个 GitHub 讨论, 或者给 Libera Chat 上的 #jujutsu 频道 发送 IRC 消息。开发者们都会关注这些频道。