做了一个小project, 第一次用 Git 以外的version control,想写一写 Pijul 记录一下。
Pijul 是什么?
Pijul 是一个分布式的版本控制系统, 区别于 Git,Pijul 没有 'commits' 的概念,也不会储存备份每一个文件变化版本,而是使用 'patch',把文件的变化内容作为版本控制的主旨。除此以外,Pijul 给每一份变化的内容 (patch) 生成一个独一无二的 hash ID。
Pijul 和 Git 这两者最主要的不同是: Pijul 只针对前后变化的内容, Git 操作基于 snapshots (文件的版本)。
什么是 patch?
"A patch consists of a source file, a target file, and a function from one to the other that has certain additional properties." -- jneem
简单来说,patch 是两个文件之间的不同。比较一个文件前后变化,patch 必须是对应某一个文件经过前后变化而言的。
那如果有两个 patch 呢?使用加法结合率,先加A, 后加B,组合的结果是C.
例如,有备忘录 o ,只写着 “穿鞋 “。 现在我们在穿鞋之前加一条 ”穿袜子“,叫做 p,经过 p 得到备忘录 A。然后我们希望增加 “倒垃圾” (q) 这一项,使不包含这一项的备忘录 A 经过 q 变成备忘录 B: 穿鞋 + 穿袜子 + 倒垃圾。
组合 patches:
A (穿袜子 + 穿鞋)
p / \ r
o B (穿袜子 + 穿鞋 + 倒垃圾)
q \ / s
M (穿鞋 + 倒垃圾)
我: 穿袜子 + 穿鞋
妈妈: 穿鞋 + 倒垃圾
最终的备忘录文件: 穿袜子 + 穿鞋 + 倒垃圾
Pijul 如何完成 merge?
把每一个文件可以看成一个图。每一行都是一个 node,跟下一行有个 edge。pijul 使用 patch 的好处是用户看不到 merge conflict, 但当两个人同时编辑同一行内容或一方删除同一段信息,Pijul 会产生merge conflict.