凌晨三点的合并冲突:团队协作技术里被忽略的上下文传递
凌晨三点,手机在床头柜上震。我眯着眼看,群里一句:哥,合并炸了。那一刻真想装睡。真的。白天大家各写各的,CI一片绿,到了合并,冲突标记像红绿灯坏掉的路口,谁都不敢动。
很多人把这事归到Git头上。冤。Git只是把两边改动的差异摊开给你看。它不知道你为啥改,也不知道对面为啥改。合并冲突只是表面症状,真正丢的是改动背后的意图。
凌晨三点的冲突,不是Git的锅
那次冲突很简单:接口返回里的字段从user_name改成了userName。A同学在服务端改了,顺手更新了文档。B同学基于旧字段写页面,本地跑得好好的。合并时,一行代码对不上。工具弹出冲突标记,左边旧,右边新。看着像选择题。可B同学不知道A为什么改,A也不知道B的页面依赖旧字段做了一层兜底。于是两个人开始在群里翻聊天记录。翻了四十分钟。找到一句三天前的话:这个字段后面要统一成驼峰。就这一句。没进提交信息,没进PR描述,也没进任何文档。
你看,工具没坏。坏的是交接。团队协作技术这个词听着大,落到日常,常常就是“下一个人能不能看懂上一个人为什么这么干”。
Git三方合并冲突标记代码截图场景
团队协作技术,核心是“上下文能不能活着到达下一个人”
团队协作技术,核心是“上下文能不能活着到达下一个人”
我习惯把团队协作技术拆成三层:工具层、协议层、节奏层。工具层是Git、Jira、Slack、飞书、CI流水线,看得见。协议层是提交信息怎么写、PR描述写什么、分支怎么开、评审看哪些点。节奏层是多久同步一次、变更集多大、决策在哪落。三层里,工具层花钱就能买,协议层难统一,节奏层容易被忽略。
版本控制本身有个很朴素的模型:有向无环图。每次提交是一个节点,指向父提交。合并的时候,系统找两个分支的共同祖先,做三方比较。共同祖先是“之前大家都认的版本”,两边各自的变化是“你改了啥”和“我改了啥”。合并算法能判断同一行有没有被两边同时改。可它判断不了语义冲突。比如A删了一个函数,B在另一个文件里还在调用。文本不冲突,运行才炸。这种事,工具只能在你跑测试的时候帮你兜底。测试没覆盖到,就等线上报警。
所以团队协作技术的核心,不是把工具堆满,而是让上下文活着到达下一个人。上下文包括:为什么改、影响谁、验证过什么、出问题怎么退。少一条,下一个人就得猜。猜一次两次没事,猜多了,团队就开始靠记忆运转。记忆这东西,靠不住。
有个类比我常讲:手术交接班。上一班医生不能说“病人还行”就下班。得说清楚诊断、用药、过敏、接下来观察啥。代码交接也一样。提交信息写“fix bug”,等于交接班说“病人还行”。上下文传递的成本,会随着交接次数往上滚。 一个人猜,两个人对猜,三个人就开始开会。会一开,节奏就碎了。
把交接棒做厚:我常干的三件事
先说提交信息。别只写“改了什么”,写“为什么改”。我现在逼自己用一个小模板:背景一句,改动一句,验证一句,风险一句。不是每回都写全,但哪怕只让下一个人知道这次提交不是天上掉下来的。比如“订单列表分页参数从page改成cursor,原因是深分页慢查询;已验证前10页和空结果;风险是旧客户端需要兼容”。这种东西不优雅,但有用。
再说PR描述。PR不是给领导看的汇报,是给评审者省脑力的说明书。我会放三样:复现步骤、关键截图或录屏、回滚方案。截图别只截成功页面,把失败态也截上。录屏别超过两分钟,太长了没人看,对吧。评审者不是不想认真,是一天看八个PR,脑子真的转不动。
还有决策日志。ADR,架构决策记录,听着像大厂黑话,其实就是一个 markdown 文件:当时的问题、考虑过的选项、拍板选了什么、为什么、什么时候可能重审。放在仓库里,跟代码一起版本化。别放wiki深处,没人找得到。这个动作对跨时区团队特别值。夜里你睡了,第二天同事醒来,不用先翻五十条聊天记录。
开发团队代码评审上下文传递白板场景
别把协作技术做成流程表演
别把协作技术做成流程表演
误区挺多。一个常见误解是:工具越多,协作越顺。真不是。Jira字段填得满满当当,PR模板五颜六色,站会雷打不动,结果大家花在“让流程看起来正确”上的时间,比写代码还多。流程表演,累人,还不解决上下文丢失。
另一个误解是:文档越全越好。文档会腐烂。写的时候是真理,三个月后是考古现场。我更倾向把关键上下文塞在离改动近的地方:提交信息、PR、测试用例、ADR。文档不是不要,是别指望它独自扛下所有交接。
边界也得说清楚。小团队、高信任、天天见面,流程可以轻。轻到提交信息短一点、评审口头说两句,也能转。强监管场景,比如金融、医疗、航空,审计和追溯是硬要求,提交信息、评审记录、回滚方案就不能省。跨时区异步协作,上下文载体要更厚,因为同步沟通的窗口太窄。关键决策别硬异步,该开会开会。异步不是万能药,它只是把沟通从“实时”挪到“可回看”。
我一直觉得,团队协作技术不是让所有人变成同一种人。它更像给交接棒加一层缓冲:你写清楚一点,我少猜一点;你留个回滚方案,我夜里少慌一点。凌晨三点的合并冲突不会消失。但好歹,下一次手机响,我能先看懂它为什么响。