面向 Git 用户的 jujutsu 使用入门
在软件开发领域,版本控制是协作的基石。
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 模式即可 |
资料
- 官方书:https://github.com/martinvonz/jj/blob/main/docs/tutorial.md
- 实时更新教程:https://steveklabnik.github.io/jujutsu-tutorial/introduction/introduction.html
- 命令补全:在 zsh/bash 里 source <(jj util completion zsh)
速查清单(贴墙用)
# 新功能
jj new main -m "xxx"
# 迭代
jj commit -m "..."
# 整理
jj rebase -i 'main'
# 推送
jj git push -c @-
# 回滚
jj op restore <prev>
面向 Git 用户的 jujutsu 使用入门的更多相关文章
- Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍
系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...
- 转:git教程 ~~非常好的入门教程
--------------------------------------- notes: cdmkdir dirnametouchls > filenamelsecho "this ...
- Git:本地建服务器及入门使用方法
1. 安装与配置Git服务器 sudo apt-get install git 1.1 注册一个git账号, 用于运行和维护git sudo adduser git 1.2 创建证书登录: 收集所有需 ...
- 修改git用户密码
第一步:登录git服务器: 第二步:切换到git用户 su git 第三步:登录GitLab的Rails控制台(GitLab使用RoR语言开发), gitlab-rails console produ ...
- C#面向服务编程技术WCF从入门到实战演练
一.WCF课程介绍 1.1.Web Service会被WCF取代吗? 对于这个问题阿笨的回答是:两者在功能特性上却是有新旧之分,但是对于特定的系统,适合自己的就是最好的.不能哪一个技术框架和行业标准作 ...
- git用户限制ssh登录服务器
服务器额外的防范措施: 搭建git服务器后通常会建立一个git账户,其它人共用这个账户来克隆或推送数据到git仓库中,通常也只需要这个功能,但是如果不加限制,那么其它人可以通过这个git账户登录到主机 ...
- 『现学现忘』Git基础 — 11、配置Git用户签名的方式
目录 1.配置Git签名 (1)语法 (2)配置系统用户签名 (3)配置全局用户签名 (4)配置本地用户签名 2.查看三个配置文件的用户签名 (1)语法 (2)查看项目/仓库级别的配置文件信息(loc ...
- 『现学现忘』Git基础 — 12、Git用户签名(补充)
目录 1.修改用户签名 2.取消用户签名 3.用户签名的优先级 4.总结本文用到的Git命令 1.修改用户签名 其实很简单,就是重新执行git config命令,换个用户名和邮箱地址就可以了,新配置的 ...
- 【github&&git】2、github入门到上传本地项目
[在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...
- git学习(2)----入门
一.git.github和gitlab的区别 Git诞生于2005年,大神Linus的作品,Github诞生于2008年,没有Git就没有GitHub,Github已成为全球最大的代(tong)码(x ...
随机推荐
- 2025西安交大集训Day1:二分,三分,哈希,高精度,位运算,模拟退火
2025西安交大集训Day1:二分,三分,哈希,高精度,位运算,模拟退火 二分 详见2025dsfz集训Day2:二分与三分,三分在当前文章内已经重构过. 三分 三分算法详细解释 三分算法(Terna ...
- Git错误,fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream
问题:当我执行git push命令的时候,报错如下: fatal: The current branch master has no upstream branch. To push the curr ...
- 揭秘AI自动化框架Browser-use(二),如何构造大模型提示词
在上一篇技术分析中,我们探讨了Browser-use框架如何实现页面元素标注.本文将聚焦于其提示词构造流程,揭示AI如何理解浏览器界面的核心机制. 上一篇-揭秘AI自动化框架Browser-use(一 ...
- 解析异步消息加上(→_→)@SuppressLint("HandlerLeak")
在主线程又Handler处理消息出现时这样写会有警告 private Handler handler = new Handler(){ @Override public void handleMess ...
- idea 调试的时候变量的值变成了jar包显示
如图所示,暂时不知道怎么处理. 应该是module的问题.我是上了重建module了,代码不是很多.
- Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件
1.简介 在我们使用JPA时,构建 Specification 查询条件时重复代码过多,而且需要大量的无效代码. 2.工具类提供的方法 2.1.自动构建规范 /** * 自动构建规范 * * @p ...
- 思科安全大模型SOC作业应用分析
思科与Meta联合推出的 Foundation-sec-8B 大模型及 AI Defenders工具包,标志着AI技术在网络安全领域的深度融合与创新突破.两者的协同不仅重构了传统安全运营模式,更开创了 ...
- Django内置filter总结
内置过滤器 目的是对绝大多数的内置过滤器进行测试总结学习,现设置如下: urls.py中设置: urlpatterns=[ url(r'^method',views.method,name='meth ...
- Longest Consecutive Sequence——LeetCode进阶路
原题链接https://leetcode.com/problems/longest-consecutive-sequence/ 题目描述 Given an unsorted array of inte ...
- 简单介绍List和数组转List集合
目录 综述 如何创建List 六种数组转List的方法 for循环遍历 Arrays.asList() new ArrayList<>(Arrays.asList(array)) Coll ...