结论先给:只有在两个服务商改动的是完全不同的文件路径、且都通过版本控制提交时,同时改同一网站才不会互相覆盖。只要其中一方直接在生产环境用FTP或后台编辑器改文件,另一方又用另一套流程发布,覆盖几乎只是时间问题。判断是否安全,不看谁更专业,而看两条改动链路是否共享同一个版本记录和同一条发布出口。
覆盖通常不是“两个人同时按保存”这么简单,而是三层中的某一层出了问题:文件层、数据库层、发布层。文件层指模板、样式、脚本被整份替换;数据库层指文章、配置、表单数据被另一套备份回滚;发布层指两边的构建产物各自覆盖对方的线上目录。
要定位,先做一次可区分的观察,而不是只看页面是否变样:
这三类现象的下一步动作完全不同:文件层要收敛发布出口,数据库层要约定谁负责备份与恢复,发布层要统一构建产物的来源目录。
可以并行的条件很具体:两个服务商都在同一个代码仓库的独立分支上工作,改动文件不重叠,合并由同一人审核,发布只从主分支出。此时两边同时改,冲突会在合并时暴露,而不会直接盖掉线上内容。
必须串行的条件同样具体:一方只能通过主机面板或FTP直接改线上文件,另一方用本地构建后上传。这种情况下,哪怕两人改的是不同页面,整目录上传也会把对方的改动抹掉。此时正确做法不是“沟通好时间”,而是把其中一方的改动先落到仓库,再由唯一发布方上线。
一个假设例子:A负责改产品页模板,B负责改博客样式。若A用FTP把整个模板目录传上去,B在样式文件里的改动即使已经保存,也会因为目录被整份替换而消失。反过来,如果两人都提交到仓库、由同一脚本发布,模板和样式是两个文件,合并时不会互相影响。这里的差别不在工作量,而在发布路径是否唯一。
第一步是确定唯一发布出口:谁拥有把改动推到线上的权限,另一个人只提交、不直接发布。这个动作的结果是,覆盖从“随时可能发生”变成“发布时才会暴露”,而暴露点是可以被检查的。
第二步是给每个服务商划定可写的路径范围,并在仓库里用目录区分,例如 themes/ 与 plugins/ 分开,避免两人改同一个文件。路径不重叠,合并冲突的概率会明显下降。
第三步是约定发布前的检查顺序:先拉取对方最新提交,再合并,再发布。若合并出现冲突,先解决冲突再发布,而不是先上线再补。这个动作会直接影响下一步:只要有一次绕过检查直接发布,之前的约定就失效,需要重新确认两边是否还在同一流程里。
第四步是保留可回退的版本记录。没有版本记录时,覆盖发生后只能靠备份猜测丢了什么;有记录时,可以对比两次提交找出被替换的文件,再决定恢复哪一个版本。
如果两个服务商各自维护一套完整站点副本,并且都认为自己才是线上版本的来源,那么即使都用了版本控制,也仍会覆盖。因为两边的主分支不是同一个,合并无从发生,发布时各自覆盖对方。这种情况下,先不要继续讨论分支策略,而要先把“哪套副本是唯一事实来源”定下来,否则任何并行安排都只是把冲突推迟到下一次发布。
做一次小范围验证:让两个服务商各改一个互不重叠的文件,都提交但不发布,由唯一发布方合并后上线。上线后检查两处改动是否都在,以及文件修改记录是否对应两次提交。若两处都在,说明流程成立,可以继续并行;若只有一处,说明还有一条链路绕过了仓库,需要先找出这条链路再扩大协作范围。