Jujutsu 超级合并:多工作流并行处理,复杂开发环境的实用利器!
合并提交并非你所想普通 Git 用户甚至未深入研究高级工作流的 Jujutsu 用户可能会惊讶合并提交没什么特别只是有多个父提交的普通提交甚至可以为空。合并提交也不限于两个父提交有三个或更多父提交的合并提交被非正式称为 章鱼合并它是超级合并工作流的核心。什么是超级合并在超级合并工作流中很少直接在分支顶端工作而是创建章鱼合并提交超级合并将关注的工作分支作为其父提交包括 bug 修复分支、功能分支等所有关注内容。重要的是不推送超级合并只推送组成它的分支。虽然听起来复杂但带来诸多好处1. 始终在所有工作总和上开发若工作副本能编译运行可知工作间无交互问题。2. 很少担心合并冲突因 Jujutsu 中冲突是一等概念且一直在合并更改代码托管平台上不会突然有意外冲突。3. 切换任务摩擦小在超级合并基础上工作切换任务无需用版本控制系统创建小 PR 更易。4. 更容易保持分支更新可用变基命令将超级合并与主干分支同步。如何创建超级合并创建超级合并很简单创建新提交将希望包含的分支作为父提交作者喜欢命名并保持为空。创建后会得到空提交其之上的内容视为正在进行的工作WIP可按需拆分内容、创建分支。如何实际提交更改将 WIP 更改合并到超级合并中取决于更改位置。若更改应合并到现有更改中可用 squash 命令和 --to 标志合并到下游提交若提交包含多个更改可 split 为多个提交或用 squash --interactive 交互式合并。Jujutsu 的 absorb 命令可自动识别并合并更改虽不总能捕获所有内容但通常能处理至少 90% 的更改。若有属于新提交的更改可进行变基操作并移动书签。若开发新功能或修复不相关 bug可用别名将新更改包含到超级合并中。如何保持所有内容更新Jujutsu 可将整个工作树变基到主分支但仅在工作树是自己的更改时有效。为解决引用他人提交的问题可使用 Jujutsu 社区提出的修订集只变基实际控制的提交保留无法控制的分支和堆叠在他人分支上的工作。总结Jujutsu 的超级合并很实用允许同时处理多个工作流。可将以下内容添加到配置中[revset-aliases] closest_merge(to) heads(::to merges()) [aliases] # jj stack revset 以包含特定的修订集 stack [rebase, --after, trunk(), --before, closest_merge(), --revision] # jj stage 以包含超级合并之后的整个堆栈 stage [stack, closest_merge().. ~ empty()] # jj restack 以将你的更改变基到 trunk() 上 restack [rebase, --onto, trunk(), --source, roots(trunk()..) mutable()]使用 absorb 和/或 squash --interactive 合并新更改用 commit 和 rebase 创建新提交用 commit 结合 stack 或 stage 移动分支。需注意超级合并不适合推送到远程仓库仍需单独发布分支。脚注1. 在 Git 中包含冲突解决之外新更改的合并提交被称为 邪恶合并在 Jujutsu 中邪恶合并并非真 邪恶因它比 Git 有更一致的模型。提交 ID: b976b2a9c6ebbaada7fcd9d112a8390f2cb75b54 更改 ID: tqxoxrwqqqtmxvywmzmspstupqqkskqk 作者 : Isaac Corbrey isaacisaaccorbrey.com (28 分钟前) 提交者: Isaac Corbrey isaacisaaccorbrey.com (24 分钟前) 父提交 : ttnyuntn storage: 对齐瞬态缓存流形 父提交 : qupprxtz ui: 调整布局启发式算法 io: 疏通极性阀 添加普通文件 two.txt: 1: # Sphinx of black quartz, judge my vow2. 别名是 Jujutsu 强大的一部分有修订集别名和命令别名两种类型。3. Jujutsu 有 可变 和 不可变 提交的概念可帮助避免出错也可使用 --ignore-immutable 覆盖。