背景
上线前,拉取了最新的远程 master 分支至本地 master 分支,切换至当前 feature 分支,并执行 命令git merge master,没有冲突,直接推 feature 分支至远程仓库。
车票流水线自动构建,报错了,提示缺少模块 xxx。
这很出乎意料,原因如下:
-
分支 master 是线上分支,功能是正常的,模块 xxx 是存在的;
-
分支 feature 是功能分支,合并前本地运行是正常的,模块 xxx 是存在的;
-
一旦合并,模块 xxx 就不再存在。
排查流程
-
撤销 merge 后,模块回来了;
-
仔细对比,模块 xxx 在 package.json 中位置不同;
-
通过分析文化历史发现
-
在两个分支的共同起点中,package.json 中模块 xxx 存在 A、B 两处,即同一个 package.json 文件中声明了两次相同的依赖;
-
在分支 master 中,删除了 package.json 中位于 A 处的模块 xxx;
-
在分支 feature 中,删除了 package.json 中位于 B 处的模块 xxx;
-
-
由于模块 xxx 在两处不同的位置各删除了一次,merge 时, 两处删除操作都应用了,于是导致 package.json 文件中没有模块 xxx。
总结
原因:
同一个 package.json 文件中声明了两次相同的依赖,由于在不同位置,两次删除不冲突,于是直接合并了。
至于“为何同一个 package.json 文件中声明了两次相同的依赖”,可能与删除类似的原因,手动添加且位置不同,git 判断再次提交不冲突。
如何避免?
通过命令行安装脚本。
可能带来的影响?
此问题很难出现于业务代码中,影响线上可能性不大。