记一次 git merge 导致的 NodeJS 依赖丢失

166 阅读1分钟

背景

上线前,拉取了最新的远程 master 分支至本地 master 分支,切换至当前 feature 分支,并执行 命令git merge master,没有冲突,直接推 feature 分支至远程仓库。

车票流水线自动构建,报错了,提示缺少模块 xxx。

这很出乎意料,原因如下:

  • 分支 master 是线上分支,功能是正常的,模块 xxx 是存在的;

  • 分支 feature 是功能分支,合并前本地运行是正常的,模块 xxx 是存在的;

  • 一旦合并,模块 xxx 就不再存在。

排查流程

  1. 撤销 merge 后,模块回来了;

  2. 仔细对比,模块 xxx 在 package.json 中位置不同;

  3. 通过分析文化历史发现

    1. 在两个分支的共同起点中,package.json 中模块 xxx 存在 A、B 两处,即同一个 package.json 文件中声明了两次相同的依赖;

    2. 在分支 master 中,删除了 package.json 中位于 A 处的模块 xxx;

    3. 在分支 feature 中,删除了 package.json 中位于 B 处的模块 xxx;

  4. 由于模块 xxx 在两处不同的位置各删除了一次,merge 时, 两处删除操作都应用了,于是导致 package.json 文件中没有模块 xxx。

总结

原因:

同一个 package.json 文件中声明了两次相同的依赖,由于在不同位置,两次删除不冲突,于是直接合并了。

至于“为何同一个 package.json 文件中声明了两次相同的依赖”,可能与删除类似的原因,手动添加且位置不同,git 判断再次提交不冲突。

如何避免?

通过命令行安装脚本。

可能带来的影响?

此问题很难出现于业务代码中,影响线上可能性不大。