Manyana:基于CRDT的版本控制未来
BitTorrent协议创始人Bram Cohen上周发布了 Manyana,一个基于CRDT(无冲突复制数据类型)的全新版本控制系统。这个项目试图回答一个核心问题:版本控制的未来应该是什么样的?
Git的痛点:合并冲突
用过Git的人都经历过这种痛苦:两个人同时修改一个函数,合并时出现一堆<<<<<<< HEAD和>>>>>>> branch标记,你得手动对比两段几乎相同的代码,猜测原作者的意图,然后小心翼翼地解决冲突。
Cohen举了一个典型例子:
- A分支删除了一个函数
- B分支在该函数中间添加了一行日志
Git给你的冲突标记是两块不透明的代码片段,你得自己脑补发生了什么。而Manyana的冲突标记会明确告诉你:“左边删除了函数,右边在函数内添加了日志”。
CRDT的核心优势
CRDT的关键特性是合并永不失败。无论多少个分支、以什么顺序合并,最终结果总是一致的。这给版本控制带来了几个根本性改变:
1. 冲突只是标记,不是阻塞
传统VCS中,冲突会阻止合并完成。Manyana中,合并总是成功完成,但系统会标记出”可能有问题”的代码区域供人工审核。更重要的是,这些标记是有语义的——你知道每一边具体做了什么操作。
2. 行顺序永久固定
当两个分支在同一位置插入代码时,CRDT会确定一个顺序并永久保持。这避免了传统rebase后出现的诡异问题:同一段冲突代码在不同分支被保留的顺序不同。
3. 历史存在于结构中
Manyana使用”编织”(weave)结构存储文件——一个包含所有曾经存在过的代码行的结构,附带它们被添加和删除的时间元数据。这意味着合并不需要寻找共同祖先,两个状态进去,一个正确状态出来。
Rebase不必销毁历史
传统rebase的问题在于它创造了一段虚假历史:你的提交看起来像是在最新的main分支上完成的,但实际上不是。
Manyana可以在保留完整历史的同时实现rebase的效果。只需要在DAG中添加一个”主要祖先”标注,就能得到线性历史的外观,同时保留所有实际发生过的分支合并记录。
这对那些坚持”干净提交历史”的团队尤其有吸引力——你不再需要为了好看的git log而牺牲真实的历史记录。
现实检验
Manyana目前还处于早期阶段。CRDT版本控制的概念并不新鲜,但之前失败的项目都倒在了用户体验上。Cohen的洞察是正确的:CRDT合并总是成功,问题是如何有意义地呈现并发修改。
Git已经统治了版本控制十五年。它的数据模型优雅,但UX层面确实有很多历史包袱。Manyana是否能成功,取决于它能否在保持CRDT理论优势的同时,提供比Git更直观的工作流。
至少,这是一个值得关注的实验。