惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Know Your Adversary
Know Your Adversary
Google DeepMind News
Google DeepMind News
A
Arctic Wolf
P
Privacy & Cybersecurity Law Blog
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
Project Zero
Project Zero
L
LangChain Blog
N
News and Events Feed by Topic
博客园 - Franky
Last Week in AI
Last Week in AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
月光博客
月光博客
博客园_首页
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
Latest news
Latest news
WordPress大学
WordPress大学
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Spread Privacy
Spread Privacy
Attack and Defense Labs
Attack and Defense Labs
量子位
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
Webroot Blog
Webroot Blog
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
T
Troy Hunt's Blog
Security Latest
Security Latest
小众软件
小众软件
Cloudbric
Cloudbric
Hacker News: Ask HN
Hacker News: Ask HN
S
Secure Thoughts
雷峰网
雷峰网
T
Threat Research - Cisco Blogs
H
Hacker News: Front Page
IT之家
IT之家
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - 大卫小东(Sheldon)

Rust 推荐使用宏而非普通函数的场景 华为公司发布半导体演进新范式 - “韬(τ)定律”(Tau Law) 霍尔定理和最大流算法 入门 Rudist v0.5.1 发布:AI 驱动的 Redis 客户端,更快、更直观 Rudist 0.4.3 发布:让 AI Agent 替你操作 Redis 集成AI 的 Redis 客户端 Rudist发布新版了 大模型智能体 (agent)简易流程介绍 在Mac安装阿里巴巴新神器copaw GIM 2.0 发布:真正让 AI 提交消息可定制、可控、可项目级优化 postgreSQL 中的自定义操作符 SQL查询中的窗口函数(主要以 PostgreSQL 为例) SQL中的CTE用法初步(Common Table Expression公共表表达式) 公司新来的00后老板让我们把数据库改成PostgreSQL,大家怒了😂 革命你的 Git 提交消息 - GIM 1.8.0 发布了! 使用JMH对远程接口进行压测 如何用Java25编译Java17的项目 写了一个BBP算法的实现库,欢迎讨论 智能生成git提交消息工具 GIM 发布 1.7 版本了 GIM 1.5发布了! 支持Windows系统了 GIM 1.4 发布了 (附使用 mkdocs 快速制作静态站点流程)
面向 Git 用户的 jujutsu 使用入门
大卫小东(Sheldon) · 2025-07-17 · via 博客园 - 大卫小东(Sheldon)

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

Jujutsu和Pijul代表了版本控制工具的两个革新方向:前者通过兼容性和简化操作降低使用门槛,后者通过数学化模型解决根本痛点。对于Git资深用户,Jujutsu是“即插即用”的效率工具,而Pijul更适合作为长期技术探索。
两者目前均无法完全替代Git,但在特定场景下已展现出显著优势,值得根据团队需求选择性尝试。

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

核心创新

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

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

2. 自动重基与变更追踪

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

3. 多后端支持

默认使用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>