代码是写给人看的 Pt.2
之前一直有同事问我为什么我们用 git rebase ,不用 git merge 合代码。我只是解答干净,一条线方便查找代码,实在懒得解释了,就说是 XX(团队大哥)定的,信我,听他的绝对没错。网上看了蛮多解释 www.zhihu.com... ,实践上都挺对的,也都有自己的理由。这次我也来想想问题的本质。
通常我们要求所有的 git 仓库都有一条主分支 master。这条 master 分支记录了从仓库诞生、不断变化、演进甚至终结的过程。变化的是什么?变化的是代码,代码代表了软件,于是仓库的一生就是软件的一生。若又软件比做人,它蕴含的意义便是一个人的出生、成长、死亡。
抛开被米国超级英雄电影玩烂的多元宇宙概念,一个人,他自己,只可能有一条时间线。人在时间线上只能不断前进。回首过去、展望未来,也不过是尝试在时间线上来回前进后退。这是我们对世界的认知,一个刻在血脉里遗传的远古记忆。我们会本能的将原始认知映射到世间万物,尝试解释我们看到的一切事物,用这种认知构建知识体系、构建社会,再反过来解释。
一个人有一条时间线,多个人就有多条时间线,每个人在自己时间线上做的事情是不一样,从一个地方开始分叉,独立运行,最后汇合,十分容易理解。于是 git merge 出现了,大家很自然的接受了。
从软件的角度来看,软件是在时间线里不断变化,不过我们拥有了对软件时间的控制权,可以让用户强制使用同一个版本,或者提供多个版本让用户随意使用。
但不管是人还是软件,我们实际上都处在一个宇宙里,时间对大家都是平等的,人和事物从整体上看都只有一条时间线,所以在开发软件时,我们只需要关注主分支这一条时间线上就行,其他开发时间线从哪里切出来,中间经历了什么,最终有什么样的结果,这些都不重要,最终你在主时间线上的内容是我们想要的、可操作的就行,摒弃掉多余的干扰,保持纯净、降低认知负担,就是 cherry-pick 和 rebase 这对黄金搭档的意义。
君不见黄河之水天上来,奔流到海不复回