LWN:介绍jujutsu——跟Git兼容的版本控制工具!

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

关注了就能看到更多这么棒的文章哦~

Jujutsu: a new, Git-compatible version control system

By Daroc Alden
January 19, 2024
ChatGPT translation
https://lwn.net/Articles/958468/

Jujutsu 是一个由 Martin von Zweigbergk 于 2019 年作为个人爱好项目创建的跟 Git 兼容的分布式版本控制系统。它旨在成为一个更简单、性能更高、更易于使用的 Git 替代品。Jujutsu 拥有一个彻底简化的用户界面,并集成了基于 patch 的版本控制系统中的想法,以便采用新颖地方法来解决合并冲突。它是用 Rust 编写的,可在 Apache 2.0 许可下使用。

与其他基于 Git 的项目(例如 Gitless 或 Magit)不同,Jujutsu 在设计时就考虑了最终摆脱对 Git 的依赖。Jujutsu 的代码本身是用 Rust 编写的,但它链接了 libgit2(核心 Git 功能的 C 语言实现)以与 Git 仓库进行交互。Jujutsu 可以使用 Git 仓库作为其存储后端,或使用其自己的自定义存储后端。原生后端尚未准备好投入使用。该项目的 README 中指出:“后端主要是用于确保最终能够添加无法轻松添加到 Git 后端的功能”。现在由 Google 资助从事该项目的 Von Zweigbergk 计划为 Jujutsu 扩展一个面向 Google 内部基于云的存储的后端(如 他的 2022 年 Git Merge 演讲幻灯片 中所示)。Jujutsu 被设计为惰性地从其存储后端获取信息,特别是为了支持大型 monorepos,例如 Google 使用的主要场景。

目前,Jujutsu 致力于成为一个简单的 Git 替代品,用于日常工作流。核心贡献者使用它来处理 Jujutsu 仓库,而不会遇到重大问题。然而,该项目仍然缺乏对 Git 的一些更高级特性的支持,包括子模块、部分克隆、浅克隆、多个工作树、稀疏检出、签名提交和 Git Large File Storage (LFS)。

此外另一个困难之处在于缺乏对 挂钩(hook) 的支持,也就是可以在 Git 操作的不同点上调用的外部脚本。Git 曾经有很多用 shell 脚本编写的组件,使其能够轻松添加要针对各种操作调用的挂钩。即使许多核心组件已重写为 C,Git 也始终保持向后兼容,主要是针对调用挂钩的时间。Git 贡献者 Elijah Newren 指出该问题 是改进 Git 的 rebase 操作性能的难点之一。

计划在 Jujutsu 中添加对一部分挂钩的支持,但这比看起来的更困难。与 Git 不同,Jujutsu 旨在让所有操作直接针对底层存储运行,并在事后将任何必要的更改生成到文件系统中去。这个选择允许 Jujutsu 在裸存储库中使用相同的命令工作,并在不触及文件系统的情况下执行更有效率的内存内转换,但这使得支持挂钩变得具有挑战性。由于挂钩是外部程序,它们通常期望通过文件系统与存储库进行交互,而在内存中直接执行操作时则不可能做到这一点。这个不足之处也意味着 Jujutsu 无法配置使用不同的合并策略。

Jujutsu 从一开始就注重性能的设计意味着它可以用比 Git 快得多的速度完成 rebase 操作。Jujutsu 的优异性能促使 Elijah Newren 和 Christian Couder 提议一项“=git replay=”的新命令,使 rebase 操作更快。它实现这一点的部分方式是通过采用合理默认值(例如,使相当于“–reapply-cherry-picks”的值成为默认值),部分是通过尽可能避免像“git rebase”那样遍历 commit graph 来实现。在首次引入“git rebase”时,遍历 commit graph 以获取会减少所需合并次数的额外信息是一种合理的性能优化,但现在其他有关合并的性能改进已经让这种权衡在大多数情况下都不再值得。尽管“git replay”比“git rebase”有显著提升,但与 Jujutsu 的 rebase 操作相比仍然落后。

  • 功能

    Jujutsu 还有其他几个方面不同于 Git。最引人注目的一点可能是删除了暂存区(index)。在 Jujutsu 中,工作树由实际提交直接表示。可以通过直接编辑磁盘上的文件来编辑该提交,而无需暂存或取消暂存。运行 Jujutsu 命令将在执行其他操作之前将来自文件系统的所有更改复制到工作提交中。若要最终完成提交并停止编辑,用户只需在旧提交之上使用“jj new”创建一个新工作提交。由于工作副本是与其他副本一样的提交,因此 Jujutsu 不需要像“git add”或“git stash”之类的修改暂存区的命令。

    Jujutsu 中的大多数命令默认会影响工作副本,但可以通过指定它们的修订版本来对其他提交执行相同的操作。例如,“jj describe”用于更改提交的消息。如果在没有任何其他参数的情况下调用它,它会更改工作副本的提交消息。如果使用另一个修订版本调用它,它会更改历史提交的提交消息,并透明地对所有依赖于它的内容进行 rebase。其他命令,例如“jj move”(可在提交之间移动差异),也是遵循同样的原则。

    这种自动地 rebase 提交的做法虽然很方便,但也自身会带来一堆问题,尤其是在 rebase 那些已发送给其他开发人员或是发送到中心化服务器的提交的时候。为了减少隐式 rebase 产生的各种冲突,Jujutsu 使用了来自基于补丁的版本控制系统(例如 Darcs 和 Pijul) 的一个创意。这些系统允许任何人提交冲突并在之后解决冲突。这个过程不涉及对文本冲突标记进行提交,而是使用冲突树的表述形式。这样的话就可以在之后的提交当中解决冲突了。

    冯·茨韦伯格 给出了一个关于如何运作的示例。考虑如下的 Git 历史记录,类似于这样:

    o---*---o topic
             /
    o---o---o---*---o---o main

    以星号标记的两个提交具有互相冲突的改动。此代码的作者想要将 main 分支合并到 topic 分支,解决合并冲突,然后在稍后将 topic 分支 rebase 到 main 分支,从而消除不必要的合并。使用 Git 时,作者可以使用 "git rerere" 来记住这次的冲突解决方式(conflict resolution),并在 rebase 时重新应用。使用 Jujutsu 时,他们可以简单地 rebase 到 main 分支的上面并修复冲突,得到以下历史记录:

    o---*---o---+ topic
                                 /
    o---o---o---*---o---o---o---o   main

    现在,如果作者使用 “jj log” 检查此历史记录,他们会看到标记在 topic 分支上的以星号标记的提交被标记为具有冲突,其后的提交亦是如此。带有加号的提交是解决冲突的提交。在稍后,如果他们想要清除其历史记录,则可以将冲突解决移入最初出现问题的提交中,并获得一个干净的线性历史记录,通过使用如下命令:

    jj move --from <plus commit> --to <star commit>

    通过这种方式存储冲突信息,Jujutsu 可以确保合并和 rebase 始终“成功”——可能会留下一些冲突的代码树,可以在之后进行处理。冲突的树可以像普通树一样提交、检出和编辑。冲突文件呈现为 Git 在合并失败后添加的文本冲突标记,但内部表示为一系列差异。存储冲突的方法可能无法有效发挥作用的用例之一是二分查找,因为冲突提交可能无法正确完成编译。计划增加二分查找支持,但实现尚未最终确定。以这种方式表示冲突的一个优点是 Jujutsu 不需要“git rebase –continue”的等效项。每次 rebase 和每次合并都在一个命令中完成,而不会在中间停止以寻求帮助,Git 就容易出现这样的情况。

    这就引出了 Jujutsu 的重要功能:操作日志(the operation log)。像 Git 的 reflog 一样,操作日志跟踪存储库的先前状态。与 reflog 不同,操作日志将 rebase 或其他复杂操作视为单个原子项目。然后,操作日志为“jj undo”命令提供支持,该命令可以撤消任何其他 Jujutsu 命令的效果。

    快速、原子、普遍的 rebase 组合在一起提供了管理存储库的新的愿景。Jujutsu 的用户体验最终是否得到改善还有待观察,尽管其设计的根本的简约性非常令人期待。

  • 体验 Jujutsu

    虽然 Jujutsu 尚未针对大多数发行版进行打包(不讨论 NixOS ),但有兴趣尝试的读者可以下载 预编译版本 或编译 源代码. 使用 Jujutsu 克隆现有 Git 存储库的操作是使用“jj git clone”完成的。克隆包含许多 ref 的 Git 存储库可能会很慢,Jujutsu 文档警告说,同时使用 Git 和 Jujutsu 的混合存储库可能会看到 Jujutsu 命令运行缓慢,因为需要检查 Git ref 以了解命令之间的更改。

    命令行接口与 Git 非常相似,除了省略了用于操作 index 的命令。需要注意的一个不同之处是“jj log”默认仅显示本地提交。要显示存储库的完整历史记录,可以使用以下命令:

    jj log -r 'all()'

    Jujutsu 文档具有 全面的介绍 和 Git 命令和 Jujutsu 命令之间的比较.

  • 结论

    Jujutsu 在短短几年内取得了很大进展。它已经可用于处理不需要更复杂的 Git 特性的项目,并且提供了体验类似的用户界面、一些操作上更好的性能表现,以及解决冲突的有趣方法。在 Google 的持续支持下,Jujutsu 似乎有望继续积极开发。

    与此同时,Jujutsu 缺少了 Git 中的一些能够灵活适应不同用例的特性,例如挂钩 hook 或子模块 submodule。从 Git 导入许多 ref 仍然很慢,并且仍然存在一些在存储库最初设置上的不舒服的地方。Jujutsu 是否在 Google 外部得到使用取决于它的简化界面是否能够克服其对不常见工作流的可适用性降低的问题。

    全文完
    LWN 文章遵循 CC BY-SA 4.0 许可协议。

    欢迎分享、转载及基于现有协议再创作~

    长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

    bb44a54c8d3cccebe6d789a4faa0579a.jpeg

探索 Jujutsu:简洁与强大的碰撞 在当今软件开发的世界中,版本控制系统(VCS)是每个开发者的基石。它帮助我们跟踪项目的变更,合作开发,并管理代码库。而在众多选择中,Jujutsu,一个Git兼容但又简洁、强大的开源VCS,凭借其独特的优势脱颖而出。 阅读详情

相关推荐

面向 Git 用户的 jujutsu 使用入门

在软件开发领域,版本控制是协作的基石。Git作为当前主流工具,虽功能强大但设计理念可追溯至2005年,其复杂的命令集和冲突处理机制常令开发者困扰。近年来,新兴工具——比如Jujutsu(jj)和Pijul—— 越来越以其创新设计理念受到关注。Jujutsu和Pijul代表了版本控制工具的两个革新方向:前者通过兼容性和简化操作降低使用门槛,后者通过数学化模型解决根本痛点。对于Git资深用户,Jujutsu是“即插即用”的效率工具,而Pijul更适合作为长期技术探索。

jhasjfhgasjkh的博客 503

探索未来版本控制的革新之作 —— Jujutsu

在快速迭代的软件开发领域,一款高效且易用的版本控制系统是开发者的得力助手。今天,我们来深入探讨新兴的开源明星——Jujutsu,它不仅继承了前辈们的精髓,还带来了诸多创新特性,旨在让版本控制变得更加流畅和智能。 ## 项目介绍 Jujutsu,正如其名般充满力量感,是一款设计为软件项目服务的新型版本控制系统。它既适合初出茅庐的开发者,也适应于大型团队复杂的代码管理需求。与众不同的是,Jujut...

gitblog_00557的博客 1102

【免费下载】 Jujutsu (jj) 版本控制系统安装与配置指南

Jujutsu(简称 jj)是一款现代化的分布式版本控制系统,它提供了与 Git 类似的版本控制功能,但在用户体验和工作流设计上有诸多创新。本文将详细介绍如何在各种操作系统上安装 jj,并进行基础配置。 ## 安装方法 ### 预编译二进制文件安装 对于大多数用户而言,最简单的安装方式是下载预编译的二进制文件。jj 为 Windows、Mac 和 Linux 系统提供了预编译版本: - L...

gitblog_00697的博客 781

推荐:GG——交互式图形界面让Jujutsu版本控制焕然一新

![icon](src-tauri/icons/24x24.png) 在代码管理和版本控制的领域里,简洁与效率往往是开发者追求的核心。GG,一个为[Jujutsu](https://github.com/martinvonz/jj)量身打造的GUI应用,以其独到的设计理念和技术实现,正逐步改变我们对版本控制工具的传统印象。 ## 项目简介 GG是一个利用[Tauri](https://tau

gitblog_00027的博客 813

JujutsuGit无缝协作:双向兼容的终极配置教程

🚀 **Jujutsu (jj)** 是一款革命性的分布式版本控制系统,它与Git完全兼容,但提供了更简单、更强大的操作体验。在本篇完整指南中,你将学习如何配置JujutsuGit的无缝协作环境,掌握双向兼容的核心技巧! ## 为什么选择JujutsuJujutsu保留了Git的所有优点,同时解决了Git的复杂性痛点。它支持所有Git命令,让你在享受现代化版本控制的同时,无需放弃现有的

gitblog_00891的博客 769

LWN: Magit 和 Majutsu:易于探索的版本控制

一位用户认为相比 Magit 解决 Git 界面糟糕的问题,Majutsu 的必要性可能没那么高,因为 Jujutsu (JJ) 本身的设计就已经解决了很多 UI 痛点,命令行非常易用且自动化程度高,但他也承认 Magit 类接口对吸引 Git 用户迁移有帮助。主状态窗口中的图表显示了与 Git 模型的一些差异——例如,它显示的是提交标识符(在左侧,以粉红色或紫色字母开头),而不是提交哈希。Magit 的临时窗口是其半图形界面的核心,使得该软件包能够将键盘驱动的操作与基于文本的状态显示结合起来。

Linux News搬运工 141

LWN:为下一个十年演进 Git

关注了就能看到更多这么棒的文章哦~FOSDEM Git 无处不在;在过去的二十年里,这个版本控制系统(Version Control System,VCS)真正实现了统治世界。几乎每个开发者都在使用它,绝大多数开源项目都托管在 Git 仓库(Repository)中。然而,这并不意味着它是完美的。Patrick Steinhardt 在 FOSDEM 2026 的主会场演讲中讨论了 Git 的一些缺点,以及如何通过改进让 Git 为下一个十年做好准备。 Steinhardt 提到,他在 2002 年左右(当

Linux News搬运工 131

Jujutsu(jj)革命性版本控制系统:10个Git兼容的终极技巧指南

Jujutsu(简称jj)是一款革命性的分布式版本控制系统,它不仅与Git完全兼容,还提供了更简单、更强大的操作体验。作为新一代DVCS工具,jj让版本控制变得更加直观和高效。在这份完整指南中,你将学习如何充分利用jj的强大功能,提升你的版本控制工作效率。 ## 🚀 为什么选择Jujutsu版本控制系统? jj版本控制系统最大的优势在于它与Git的完美兼容性。你可以继续使用熟悉的Git命令,

gitblog_00778的博客 558

Jujutsu vs Git:10个关键差异与优势对比分析 [特殊字符]

Jujutsu(简称jj)是一款现代分布式版本控制系统,与Git完全兼容但提供了更简单强大的用户体验。作为Git的替代品,Jujutsu在保持Git数据模型的同时,重新设计了用户界面和工作流程。本文将通过10个关键维度深入对比分析JujutsuGit的核心差异与优势,帮助开发者了解如何选择适合自己项目的版本控制工具。 ## 📊 核心功能对比概览 Jujutsu作为Git兼容的DVCS,既简

gitblog_00016的博客 999

新晋版本控制系统 Jujutsu 来袭,让版本控制更简单强大还兼容 Git

【导语:在程序员常用的版本控制系统中,Git 虽广为人知,但存在特性和使用难点。Jujutsu 的目标是让版本控制变得更简单、更强大。它能够与 Git 的底层存储系统保持兼容,这意味着它既可以利用 Git 已有的资源,又能提供更优的体验。如今,Git 是程序员们最常用且熟悉的版本控制系统,不过它存在一些特性和使用上的难点。而新晋的 Jujutsu(简称 “jj”)正试图挑战 Git 的地位。Jujutsu 的出现为版本控制领域带来了新的选择,若其能持续优化,有望在市场上占据一席之地。

EveningTalk的博客 44

[特殊字符]【探索版本控制新纪元】GG —— 专为Jujutsu打造的图形界面工具

![icon](src-tauri/icons/24x24.png) ![screenshot](src-tauri/resources/screenshot.png) **GG**,一款革新之作,它旨在成为[Jujuetsu](https://github.com/martinvonz/jj)版本控制系统的一流图形界面。利用Jujutsu灵活的底层原理,GG将你的代码库操作变成了一场交互式的冒

gitblog_00111的博客 569

【Rust日报】文章《Git 高手应该尝试使用 Jujutsu/jj 来操作历史提交》

CodeQL 是 Github 的一项安全服务,对你的仓库中的 C/C++、Java/Kotlin、JS/TS、Python、Ruby、C#、Go、GitHub Actions、Swift、Rust 代码进行扫描,并运行数百项代码检查,同时保持较低的误报率和较高的准确率。阅读:https://github.blog/changelog/2025-06-30-codeql-support-for-rust-now-in-public-preview/CodeQL 代码扫描支持扩展至 Rust。

Rust语言学习交流 607

jjui:终端用户界面,助力版本控制新体验

`jjui` 是一款针对 [Jujutsu 版本控制系统](https://github.com/jj-vcs/jj) 设计的终端用户界面。开发者根据个人需求构建了这款工具,并且将持续添加新的功能。它不仅满足了开发者的个人使用需求,也欢迎来自社区的功能建议和贡献。 ## 项目技术分析 `jjui` 采用 Go 语言进行开发,具有良好的性能和跨平台兼容性。项目通过终端提供了一系列直观的交互界面,...

gitblog_00624的博客 802

Jujutsu Kaizen版本控制工具中的行注释显示问题分析与解决方案

Jujutsu Kaizen版本控制工具中的行注释显示问题分析与解决方案 问题现象 在Jujutsu Kaizen(简称JJK)版本控制工具的VSCode扩展中,用户报告了一个关于行注释(line annotations)显示异常的问题。具体表现为: 行注释会破坏编辑器布局,导致文本内容发生偏移 在某些情况下会触发编辑器不必要的水平滚动 在使用VIM模式时尤为明显,会出现文本短暂跳动的情况 技...

gitblog_07244的博客 423

【Rust日报】Burn 团队2024的总结和2025的期望

Jujutsu - 版本管理系统,Git之上的一层封装Jujutsu(简称“jj”)是一款新的版本控制系统,旨在提供比传统Git更直观和高效的用户体验。尽管它与Git共享底层数据存储,但在用户交互和概念模型上有所不同。在jj中,工作副本的状态始终被视为一个提交(commit),这意味着每次对文件的编辑都会立即反映在当前提交中。这种设计带来了多种优势,例如无需使用“stash”命令保存当前工作,直接...

Rust语言学习交流 948

终极指南:Jujutsu工作副本即提交机制,彻底告别Git暂存区的烦恼

Jujutsu(简称jj)是一款兼容Git的分布式版本控制系统(DVCS),其核心理念是**"工作副本即提交"**,彻底简化了传统版本控制中的暂存区概念。本文将详细介绍这一创新机制如何让开发者告别繁琐的`git add`命令,实现更流畅的开发体验。 ## 什么是工作副本即提交机制? 在传统Git workflow中,开发者需要通过`git add`将修改从工作区暂存到索引区,再通过`git c

gitblog_00511的博客 929

Jujutsu核心技术解析:工作副本即提交的创新设计

Jujutsu VCS 通过革命性的工作副本自动提交机制重新定义了版本控制系统。与传统系统不同,Jujutsu 将工作副本本身视为真实的提交对象,实现了自动快照、无冲突操作和实时更新。本文深入解析其核心设计理念、自动提交流程、冲突处理机制以及性能优化策略,展示这一创新设计如何简化版本控制工作流程并提供更强的一致性和可靠性。 ## 工作副本自动提交机制原理 Jujutsu VCS 最核心的创新设...

gitblog_00279的博客 484
上一篇: LWN:6.8 合并窗口的剩余内容!
下一篇: LWN:mseal() 即将确定!
LinuxNews搬运工
博客等级 码龄7年 419粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值