在软件开发领域,版本控制是协作的基石。

Git作为当前主流工具,虽功能强大但设计理念可追溯至2005年,其复杂的命令集和冲突处理机制常令开发者困扰。近年来,新兴工具——比如Jujutsu(jj)和Pijul—— 越来越以其创新设计理念受到关注。

Jujutsu和Pijul代表了版本控制工具的两个革新方向:前者通过兼容性和简化操作降低使用门槛,后者通过数学化模型解决根本痛点。对于Git资深用户,Jujutsu是“即插即用”的效率工具,而Pijul更适合作为长期技术探索。

两者目前均无法完全替代Git,但在特定场景下已展现出显著优势,值得根据团队需求选择性尝试。

jj 是2019 年作为个人爱好项目创建,用 Rust 编写,目前由 Google 资助开发,旨在成为更简单、性能更高、更易于使用的 Git 替代品。

核心创新

工作副本即提交(Working-copy-as-a-commit)

消除Git的暂存区(index)概念,工作目录直接映射为可编辑的提交。修改文件后无需git add,通过jj new即可创建新提交,简化日常操作。

自动重基与变更追踪

修改历史提交后,依赖该提交的后续变更会自动 rebase(如jj edit ),避免Git中手动rebase的繁琐。操作日志完整记录所有变更,支持任意步骤回滚(jj undo)。

多后端支持

默认使用Git仓库作为存储后端,可无缝衔接现有Git项目;同时支持自研存储引擎,未来计划扩展云存储支持(如Google内部系统)。

局限性:

目前还缺乏Git高级特性如子模块、LFS、签名提交和hooks,所以企业级应用存在缺口。

从零到生产

安装与初始化

Git 概念 jj 对应 命令示例
git 软件 jj软件 根据 https://jj-vcs.github.io/jj/latest/install-and-setup/ 针对不同平台安装
.git/目录 .jj/目录 jj git init --colocate(与 Git 共用仓库)或 jj init(纯 jj)
git config jj config jj config set --user user.name "Adam"

纯 jj 仓库无法被原生 Git 打开,只有 colocate 模式才能与 Git 混合使用

基本命令映射表

目的 Git jj(等效或更优)
查看状态 git status jj st(或 jj status
查看日志 git log --oneline --graph jj log(自动图形化)
提交 git commit -am "msg" jj commit -m "msg"
暂存 git add -p 不需要:jj new 自动把工作区作为「新变更集」
创建分支 git checkout -b feat jj new main -m "feat"(产生新的变更集,可理解为「匿名分支」)
切换 git switch feat jj edit <id>jj new <id>
拉取 git pull --rebase jj git fetch && jj rebase -d 'main@origin'
推送 git push origin HEAD jj git push -c <id>(第一次)或 jj git push --change <id>
修改最近一次提交 git commit --amend 直接在工作区继续编辑,然后 jj squash
交互式 rebase git rebase -i jj rebase -i
stash git stash 不需要:工作区永远干净,所有修改都在「草稿变更集」

核心概念

  • 变更集(change)= Git 中的一次 commit,但可随意改写,直到显式 push。
  • 工作区永远 clean;你始终处于某个变更集上。
  • jj new 创建新的「匿名分支」;jj branch 给变更集贴标签(类似 Git branch)。
  • 所有历史都可重写,且不会丢失旧版本(自动保留不可见的「废弃变更集」)。
  • 远程协作通过 jj git push/fetch,底层仍是 Git 协议。

日常最佳实践

# 1. 基于主干创建功能
jj new main -m "wip: add login"
# 2. 开发、迭代
vim foo.rust
jj commit -m "parse jwt"
# 3. 需要改更早的提交?直接 rebase -i
jj rebase -i 'main'
# 4. 整理完,推到远端
jj git push -c @-

高频技巧

  • 快速拆分大提交:

    jj split(交互式选择文件或 hunk 拆成两个变更集)。
  • 快速 squash:

    jj squash -r <child> -r <parent>jj squash --into <parent>
  • 撤销任何操作:

    jj op log → 找到误操作的 op → jj op restore <id>(时间机器)。

常见坑与排查

现象 原因 解决
无法 push 远端有更新 jj git fetch && jj rebase -d 'main@origin'
误删变更集 历史仍在 jj log -r 'visible_heads()' 找回,或 jj op restore
Windows 路径过长 jj 内部使用长哈希 设置 core.longpaths=true(Git 配置)
GUI 工具不支持 只认 .git 使用 colocate 模式即可

资料

速查清单(贴墙用)

# 新功能
jj new main -m "xxx"
# 迭代
jj commit -m "..."
# 整理
jj rebase -i 'main'
# 推送
jj git push -c @-
# 回滚
jj op restore <prev>

面向 Git 用户的 jujutsu 使用入门的更多相关文章

  1. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  2. 转:git教程 ~~非常好的入门教程

    --------------------------------------- notes: cdmkdir dirnametouchls > filenamelsecho "this ...

  3. Git:本地建服务器及入门使用方法

    1. 安装与配置Git服务器 sudo apt-get install git 1.1 注册一个git账号, 用于运行和维护git sudo adduser git 1.2 创建证书登录: 收集所有需 ...

  4. 修改git用户密码

    第一步:登录git服务器: 第二步:切换到git用户 su git 第三步:登录GitLab的Rails控制台(GitLab使用RoR语言开发), gitlab-rails console produ ...

  5. C#面向服务编程技术WCF从入门到实战演练

    一.WCF课程介绍 1.1.Web Service会被WCF取代吗? 对于这个问题阿笨的回答是:两者在功能特性上却是有新旧之分,但是对于特定的系统,适合自己的就是最好的.不能哪一个技术框架和行业标准作 ...

  6. git用户限制ssh登录服务器

    服务器额外的防范措施: 搭建git服务器后通常会建立一个git账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机 ...

  7. 『现学现忘』Git基础 — 11、配置Git用户签名的方式

    目录 1.配置Git签名 (1)语法 (2)配置系统用户签名 (3)配置全局用户签名 (4)配置本地用户签名 2.查看三个配置文件的用户签名 (1)语法 (2)查看项目/仓库级别的配置文件信息(loc ...

  8. 『现学现忘』Git基础 — 12、Git用户签名(补充)

    目录 1.修改用户签名 2.取消用户签名 3.用户签名的优先级 4.总结本文用到的Git命令 1.修改用户签名 其实很简单,就是重新执行git config命令,换个用户名和邮箱地址就可以了,新配置的 ...

  9. 【github&&git】2、github入门到上传本地项目

    [在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...

  10. git学习(2)----入门

    一.git.github和gitlab的区别 Git诞生于2005年,大神Linus的作品,Github诞生于2008年,没有Git就没有GitHub,Github已成为全球最大的代(tong)码(x ...

随机推荐

  1. 康谋分享 | ADTF在CAN方面技术的深入探讨

    在当今汽车电子系统的开发中,CAN总线作为车辆内部通信的骨干,承载着大量关键信号的传输.确保这些信号的高效.准确处理,对于车辆系统的稳定性和可靠性至关重要. 一.Signal Config Filte ...

  2. 『Plotly实战指南』--样式定制高级篇

    在数据可视化领域,Plotly不仅是高效的绘图工具,更是设计师的创意画布. 当基础图表已无法满足品牌化需求时,样式定制能力将成为数据叙事的关键武器. 深入的样式定制能够帮助我们打造品牌化图表.实现精准 ...

  3. Stream.findFirst()代替get(0)和数组[0]获取集合中的第一个值

    一.介绍 语法 集合.stream().findFirst() 使用 // 我们的工具类(切割SKU字符串relatedSkuJoin,转为集合).stream.第一个数(): CommonUtils ...

  4. 手把手教你使用C#创建一个WebSearchAgent

    PocketFlowSharp介绍 最近我对PocketFlow比较感兴趣,不仅是因为它是一个极简的LLM框架,更加让我觉得很不错的地方在于作者提供了很多方便学习的例子,就算没有LLM应用开发经验,也 ...

  5. 逆序对计数问题之C#实现(O(nlogn))

    逆序对计数问题是一个经典的算法问题,常见于计算机科学和数据结构领域.它的目标是计算数组中所有的逆序对的数量.逆序对是指数组中两个元素满足位置关系(i,j),且有 A[i]>A[j]. 它的应用有 ...

  6. Asp.net core中HttpResponse常用属性及Status code

    在ASP.NET Core中,HttpResponse 表示HTTP响应,其中包括一些常用的属性和方法,用于设置HTTP响应的各种属性.HTTP响应通常由一个HTTP状态码,HTTP头(headers ...

  7. C#之使用任务并行库

    .NET Framework4.0引入了一个新的关于异步操作的API,它叫做任务并行库(Task Parallel Library,简称TPL).TPL的核心是任务,一个任务代表一个异步操作,该操作可 ...

  8. ​微软 AI Agent三剑客:AutoGen、Semantic Kernel与MEAI的协同演进

    引言 微软正在积极构建其人工智能(AI)开发者生态系统,旨在为开发者提供从实验研究到生产部署的全方位支持.在这一宏大蓝图中,AutoGen.Semantic Kernel (SK) 和 Microso ...

  9. 实战干货|Spark 在袋鼠云数栈的深度探索与实践

    Spark 是一个快速.通用.可扩展的大数据计算引擎,具有高性能.易用.容错.可以与 Hadoop 生态无缝集成.社区活跃度高等优点.在实际使用中,具有广泛的应用场景: · 数据清洗和预处理:在大数据 ...

  10. Result Maps collection does not contain value for java.util.HashMap

    前言 查询报错 Result Maps collection does not contain value for java.util.HashMap 原因 SQL XML中包含此返回类型 解决 第一 ...