核心做法是先冻结写入权:同一时间只允许一方拥有生产环境的发布通道,另一方只能提交到独立分支或暂存环境,由拥有发布权的一方按变更单合并。若两方必须并行改同一页面,就按文件或模板目录拆开,并约定合并窗口,否则覆盖几乎必然发生。
假设某站点同时请了两个网站建设团队:A团队负责改促销落地页的视觉与文案,B团队负责结算流程中的字段校验。两边都拿到了同一套服务器账号,约定“各自改完就上传”。某天A把整站模板覆盖上传,B前一天改的校验文件被旧版本替换,结算页报错。这个例子是假设的,但覆盖的机制很典型:不是谁技术差,而是缺少写入边界。
要判断风险,先看两方改动的重叠面。若A改的是主题模板和全局样式,B改的是某个功能插件目录,重叠面小,用分支隔离即可;若两方都要动同一批模板文件或同一份数据库结构,就必须串行。重叠面越大,越不能靠“小心一点”解决。
文件级修改指模板、样式、脚本、配置文件的替换;数据级修改指数据库表结构、内容字段、缓存键的变更。覆盖通常发生在文件级,但数据级一旦冲突更难回滚。
如果两方都坚持要直接发布,退一步的做法是约定时间片:A在上午发布并锁定,B在下午发布前先拉取最新版本再合并。时间片只适合改动量小、发布频率低的情况,不能当成长期方案。
具体动作:让不拥有发布权的一方先提交变更清单,列出涉及的文件路径、模板名或数据表字段,再由发布方在版本控制中做一次合并,合并后立即在暂存环境跑一遍关键路径。
这个动作的结果会直接影响下一步。如果合并时出现冲突标记,说明两方确实改了同一处,需要人工决定保留哪一版,而不是直接覆盖;如果合并干净但暂存环境关键路径报错,说明冲突藏在依赖关系里,应暂停发布并回退到上一个可用版本;如果合并干净且关键路径正常,才允许发布到生产环境。把“先合并、再验证、后发布”当成固定顺序,覆盖问题就从偶发事故变成可控流程。
上面这套做法在两三个页面、单台服务器、每日发布一两次的规模下通常够用。规模扩大后会出现例外:多个环境并行、多个团队同时提交、静态资源带哈希指纹、数据库有主从延迟。此时“一个发布账号”可能成为瓶颈,需要引入发布队列或环境分级,而不是继续靠人工时间片。
另一个边界是紧急修复。线上故障时,拥有发布权的一方可能直接热修,绕过合并流程。这类操作必须留下记录,并在事后补一次合并,否则下一次常规发布会把热修覆盖掉。若无法保证事后补合并,就不要把热修当成常规手段。
这三件事确认后,再决定是分支隔离、时间片还是发布队列。选择依据不是哪套流程更先进,而是两方改动的重叠程度和发布频率。重叠越少、频率越低,流程可以越轻;重叠越多、频率越高,就越需要把写入权收拢到一处并保留可回退的版本记录。