用Jujutsu战胜Git严谨疲劳
摘要
本文介绍了一种使用Jujutsu版本控制系统的工作流程,旨在克服在Git中保持严格提交纪律的疲劳感,允许开发者先进行杂乱提交,最后再整洁地重新组织它们。
暂无内容
查看缓存全文
缓存时间: 2026/05/24 21:42
# 用 Jujutsu 战胜 Git 严谨性疲劳
来源:https://ikesau.co/blog/defeating-git-rigour-fatigue-with-jujutsu/
本文假定你对 `jujutsu` 版本控制系统(https://docs.jj-vcs.dev/latest/)有基本了解。如果你没用过 jujutsu,你仍然能理解核心思路,但我建议后续阅读 [Steve 的 Jujutsu 教程](https://steveklabnik.github.io/jujutsu-tutorial/)。
在开发大型功能时,写出“好的提交”很难。
所谓“好的提交”,我指的是像这样:
`定义类型`
`添加数据库函数`
`服务端 CRUD`
`客户端 API`
`客户端 UI`
这样可以使审阅者逐步浏览你的拉取请求,每次只看功能的一个小方面。
那么,很自然的,我实际做的是这样:
`定义类型`
`添加数据库函数`
`WIP 测试代码`
`服务端 CRUD`
`客户端 API 和 UI`
`修复数据库函数`
`修复 UI 错误`
`重构 CRUD`
`修复另一个 UI 错误`
后面的提交覆盖了前面提交的工作,故事线就断了。⚖️
Jujutsu 让在不同提交间跳转、快速迭代分块变更集变得更容易,但依然需要投入精力,我往往有抵触心理。🤖
`jj absorb`(https://docs.jj-vcs.dev/latest/cli-reference/#jj-absorb)有一定帮助,`jj squash -i`(https://docs.jj-vcs.dev/latest/cli-reference/#jj-squash)也是,但两者都有缺点:
1. `absorb` 会根据哪个之前的提交最近修改了这些文件来分配变更,但有时这并不对应这些变更本该属于哪个提交。
2. `squash` 如果你的边界不够干净,可能会让你陷入合并冲突的泥潭。
所以我针对这种“Git 严谨性疲劳”问题想出了一个解决方案。
在这个例子中,我们用直观的方式表示提交。想象红色代表对类型定义的更改,蓝色代表 UI,以此类推:
混乱不堪。我们的第一个提交是红色和蓝色的混合。我们在多个地方触碰了红色!
为了修正,我们先创建理想的提交历史,使用 `jj new -B messy-first -m 'red'`
然后我们继续创建剩下的。(此时我切换到 `jj new -A red -m 'blue'`)
接下来我们把所有有实际更改的提交 squash 成一个,使用 `jj squash --from messy-first..messy-last --into messy-first`
然后我们使用 `jj squash -i --from messy-first --into red` 并挑选出红色的更改,把它们放到红色盒子里:
依此类推:
最终所有更改都放到了正确的位置,“everything 提交”变空了。
对于大型功能,我发现这种工作流比在功能开发全过程中维持严格的 Git 严谨性要轻松得多。把临时的调试状态放进随意即兴的提交中,最后一次性整理干净,这样更容易。
### 注意事项:
1. 我给这个技巧取不出好名字。“像一大筐脏衣服那样做提交”,也许?
2. 这与 `jj split` 不同(我认为更优):1. 使用 `split`,如果我漏掉了一个本应属于红色的 hunk,就必须再次 split 然后 squash。2. 这个技巧更容易在开始时排序最简单的 hunk,而不用担心它会影响提交的顺序。
3. 之所以(通常)在最后一次性完成比在过程中使用 `jj squash -i` 更好,是因为“everything 提交”的最终状态保证不会有任何冲突。创建一个新的“修复红色和绿色”提交然后交互式 squash 进你的红色和绿色提交,可能会破坏你的蓝色提交——如果它刚好触及了受影响的文件。
4. 这个技巧的一个缺点是:无法保证每个提交都能编译通过,这可能是致命缺陷。
相似文章
jujutsu v0.42.0 发布
Jujutsu (jj) 版本控制系统发布了 v0.42.0。Jujutsu 是一款开源 VCS,以 Git 作为存储后端,同时提供更符合人体工程学的操作界面,其功能设计灵感来源于 Mercurial、Sapling 和 Darcs。
Jujutsu 大规模合并:为了乐趣与收益
本技术指南介绍 Jujutsu(一款替代 Git 的版本控制系统)中的“megamerge”工作流,讲解如何利用章鱼式合并(octopus merges,即具有 3 个及以上父提交的提交)高效管理多个并发分支与开发上下文。
使用 Git 的 rerere 功能摆脱重复冲突的困境
解释了 Git 的 rerere 功能如何自动解决重复出现的合并冲突,从而在频繁变基或合并时节省时间。
在$dayjob审查所谓的Pull Requests
一位开发者描述了他使用git命令(如range-diff和log -p)来审查pull requests的工作流程,以规避基于Web的UI的缺陷。
jj v0.41.0 发布
Jujutsu (jj) v0.41.0 已发布,这款实验性版本控制系统迎来了更新,旨在提升易用性和冲突处理能力。