社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

如果你每天都用 Git,Google 的 Jujutsu(JJ)可能会改写一切

程序员好物馆 • 昨天 • 25 次点击  
图片
来源 | 大迁世界
作者 | 前端小智

假如我告诉你:有一个由 Google 开发的版本控制系统,能解决 Git 的大多数痛点,却依然完全兼容你现有的 Git 仓库,你会怎样?

大多数开发者的日常大概是:会几条顺手的 Git 命令就够活了——git add .git commit -mgit push;乱了再来一次 rebase。

你也习惯了合并冲突、理解了暂存区(staging area),而且大概已经把  git stash 打到怀疑人生。

介绍一下:JJ

Jujutsu(命令:jj,也许会是那个让你忘掉 Git 各种“怪脾气”的工具。


JJ(Jujutsu)是什么?

它是由 Google 的软件工程师 Martin von Zweigbergk(从事源码控制)提出的一种不同思路的版本控制系统。

项目起初是 2019 年的个人兴趣,如今已成为 Google 的全职项目,目标之一是有潜力替换其内部的版本控制基础设施。

Jujutsu 使用 Git 仓库作为底层存储


与 Git 最显著的差异

1)不再被“暂存区”困扰

在 Git 里你得在三种状态间切换:

  • 工作区(working directory)
  • 暂存区(index / staging area)
  • 已提交的变更(committed changes)

在 JJ 中,只有一个核心概念:一切皆提交(commit)

你的工作副本本身就是一个提交,并会随着你的修改自动更新

# Git 工作流
echo "console.log('hello');" > app.js
$ git add app.js
$ git commit -m "Add hello world"

# JJ 工作流
echo "console.log('hello');" > app.js
$ jj describe -m "Add hello world"
# 就这样。无需 staging。

2)stash 从此“退休”

临时要去别的分支看点东西?Git 里不是临时提交就是 stash。 在 JJ 里,你的工作已经被自动提交,所以可以随时切换到任意提交而不用担心丢东西。

# Git:“糟糕,我得先去别处看看”
$ git stash push -m "work in progress"
$ git checkout other-branch
# do stuff...
$ git checkout my-branch
$ git stash pop

# JJ:“没问题”
$ jj edit other-commit-id
# do stuff...
$ jj edit @  # 回到刚才的位置

3)历史编辑不再焦虑

想修复“3 个提交之前”的一个小错别字? 在 Git 中,你大概率要交互式 rebase,要么冲突要么紧张。 在 JJ 里,你可以直接编辑那条提交所有后代提交会自动 rebase

# 想在 JJ 里修改提交 abc123?
$ jj edit abc123
# 做你的改动
$ jj describe -m "Updated commit message"
$ jj edit @  # 回到最新位置
# 所有后代提交已自动 rebase!

4)把“冲突”当一等公民

JJ 把冲突视作模型中的一等对象,而不是必须立刻处理的纯文本差异。 这意味着冲突的解决可以自动传播到后续的子提交中——复杂 rebase 时不再重复处理同一个冲突


一次典型的 JJ 工作流

开始一个新特性

# 克隆任意 Git 仓库并开始使用 JJ
$ jj git clone --colocate git@github.com:yourname/project.git
cd project

# 开始新工作(会创建一个空提交)
$ jj new -m "Add user authentication"

# 修改文件——它们会被自动跟踪
$ vim auth.js
$ vim routes.js

# 随时查看进度
$ jj diff
$ jj status

# 准备下一个工作单元
$ jj new -m "Add login validation"

与“分支”协作

JJ 默认使用匿名分支(你不用给每个小改动都起名字)。 当需要推送到 GitHub 时,使用 bookmarks(书签)

# 创建一个用于 GitHub 的 bookmark
$ jj bookmark create feature-auth

# 推送到你的 Git 远端
$ jj git push

# 远端会看到一个普通的 Git 分支,名为 "feature-auth"

Change ID 的威力

在 Git 中,只要你修改提交,提交哈希就会变化; JJ 引入了稳定的 Change ID:即便你修改了提交,Change ID 仍保持不变

$ jj log
@ abcdefgh you@email.com 2024-06-20 12:34:56 9a2b3c4d
│ Add authentication logic
○ qrstuvwx you@email.com 2024-06-20 11:30:22 5e6f7g8h
│ Initial setup

上面左侧的字母(例如 abcdefgh)是 Change ID编辑提交也不变。 右侧那串十六进制(如  9a2b3c4d)是 Git 提交哈希编辑会变化


安装与快速上手

安装 JJ 很直接:

# macOS
$ brew install jj

# Linux(不同发行版)
$ sudo pacman -S jujutsu      # Arch
$ sudo zypper install jujutsu # openSUSE

# 或从 GitHub 下载预编译二进制

在现有 Git 仓库中启用:

cd your-existing-git-repo
$ jj git init --colocate

--colocate 的意思是 JJ 与 Git 并行工作。 你仍然可以照常使用 Git 命令,JJ 会与这些变更保持同步


有什么不足吗?

JJ 并不完美,你需要了解这些限制:

  • 性能:在特别大的仓库上,某些操作可能比 Git 慢,团队正在持续优化。
  • 生态:相较 Git,周边工具还少一些。你常用的 Git GUI 或 IDE 集成可能暂不支持 JJ。
  • 学习曲线:概念更简单,但你需要改掉部分 Git 习惯,并学习新的命令。
  • 临时文件:JJ 会自动快照一切,因此需要更小心 .gitignore(避免跟踪构建产物)。

如果你不严重依赖某些 Git 专属工具或 GUI,可以这样开始:

  1. 按上面的方式安装 JJ;

  2. 先用测试仓库试试:

    jj git clone --colocate https://github.com/jj-vcs/jj.git
  3. 读基础文档:jj help,再看看 Steve Klabnik 的教程;

  4. 小步试用:先在个人项目上使用,再考虑推广到工作仓库;

  5. 记住:随时可以回到 Git 命令,两者可在同一仓库中并行。

有位开发者的形容很妙:

“如果说用 Git CLI 像是 肩膀全速撞墙,那用 jj 就像是来了一次轻松愉悦的背部按摩。”

准备好让你的日常版本控制也“按摩”一下了吗?

图片
好啦,今天的内容分享就到这,感觉不错的同学记得分享点赞哦!
PS:程序员好物馆 持续分享程序员学习、面试相关干货,不见不散!
图片
点分享
图片
点收藏
图片
点点赞
图片
点在看

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/185780
 
25 次点击