
理解 Git Branch 与 Fork:结合一线案例分析
要让世间万物更加美好,抱着这样的利他之心、关爱之心不懈地努力,那就是顺应了宇宙的潮流,
就能度过幸福的人生。
相反,憎恨、嫉妒他人,只想自己占便宜,充满利己之心的人,他们的人生将越发糟糕。
—— 稻盛和夫《活法》
所有采用 git 管理源代码的软件,均遵循如下的模式:
(完成小的修订一样通过 git commit 实现小版本迭代,到达一定程度以后,通过 git tag 标记某一个小版本号,作为大的迭代的体现)
(PostgreSQL 17.5 版本发布时的提交信息,这里以网页形式呈现,可以发现这个 commit 也被打上了 tag)
而当我们在源代码目录下面,通过 git log
指令,即可以看待每一次版本的迭代简介。
(对 PostgreSQL 某个滚动版本作 git log
,里面的三次提交,均是针对文档的改动)
而正如同项目本身乃至于技术路线有时候会出现分叉(Fork)一样,我们的软件有时候也需要同时针对多个版本进行维护,这个时候就需要我们依托 Git 中的 Branch 功能展开工作(从某种意义上面而言,项目与技术路线的分叉,就是一个大型的 Git Branch,就比如 Ubuntu 与 Fedora Linux,底子里面依旧是 Linux,但是往上的细节迭代中则存在着许多不一样的地方)。
这里我们以 Apache OpenDAL 的某次迭代更新作为切入的口子。
实践分析:Apache OpenDAL Memory 服务的改进
Apache OpenDAL 的简介可以查看我之前撰写的文章《OpenDAL 项目简介:一个通用的存储接口方案》,它是一个采用 Rust 语言编写而成的函数库,使用类文件系统的接口形式统一化各个存储后端的访问,进而降低研发的成本。
而 OpenDAL 项目的 Memory 服务,通过阅读项目研究人员历史上的发言材料(项目不仅仅只是有文档和代码,研究背后的交流也是探究各个模块设计原理的重要一环,许多项目都为这种历史发言设计了存储机制,如 PostgreSQL 的邮件存储,Github 的 Issue-Pr-Discussion 等),我们可以发现:
设计 Memory 服务的初衷,是为了简化用户的测试工作,而在随后,Memory 服务开始逐步拓展实现其它的功能,并在随后伴随着 OpenDAL 接口本身的更新而展开了重构...
而在这里,我们可以简单研究 《refactor: Implement memory services by generic kv》 这个 Pr,从现场经验理解 git 项目这几个功能的综合使用。
检查 Remove debug log
这个 commit,可以发现,正如 commit 所描述的一样,主要的意义正是移出一些调试信息。
由此,我们就可以对 Git Branch 功能建立一个基础的理解:在同一个仓库的之中,设立不同的 Branch 进行研究,并将一个代码分支作为 主代码分支
,作为软件对外发行的版本。
(OpenDAL 有许多的分支,负责不同的部分的研究)
实践分析:一个被拒绝的 Pr
在这里,可以发现代码仓库实际上被交由不同的人员进行管理,但是在实际运行上,个人研究者会将自身的研究结果(以代码形式体现)交由开源社区进行审核,并决定是否成为开源社区对外提供的项目代码的一部分。
实践分析:PostgreSQL 与 IvorySQL、Apache CloudBerry
在这里,我们引用 PostgreSQL 以及其衍生孵化项目 IvorySQL,Apache CloudBerry 作为分析的案例,他们也是对于 PostgreSQL 的 Fork,区别在于,他们依托既有的项目,建成了一个新的开源社区,形成了新的管理核心。
虽然从技术上而言,PostgreSQL 是 IvorySQL 与 Apache CloudBerry 的上游。但是,从管理团队角度上而言,三个项目实际上是各自为政,只是在某些共同领域上可以实现合作发展。
这种形式的 Fork,既有可能促进某种技术的生态繁荣,帮助某种项目在各个场景下遍地开花(如 Linux 与各种发行版),也有可能引发社区的分裂(如 MySQL 与 Redis 在管理团队作出了某些决策以后,引发社区不满,直接导致 MariaDB,ValKey,Redict,KeyDB 等新项目与新社区的成立,进而使得研发力量迅速分散)
评价的标准就是两句话:Fork 的动机究竟是怎么样的?项目的发展是好或者坏?
在我观察过的许多项目里面,出发点存在问题的,最终都不可避免地走向了灭亡。
写在最后
感谢本科生导师袁国铭主任,感谢中国 PG 分会魏波老师、王其达老师,感谢开放原子开源基金会张凯老师,臧秀涛老师,感谢 IvorySQL 社区任娇老师、牛世继老师,感谢 @Alex,感谢 @bitstring,感谢 OpenDAL 社区 @XuanWo 与 @尚卓燃。
最后,感谢稻盛和夫与他所撰写的活法,我们将会继续贯彻稻盛和夫哲学,以踏实进取、团结友爱、积极贡献、互助同兴的精神,成为一流的开源科学家,建成一个一流的开源社区!