Quando você tem esses conflitos, geralmente acontece quando instala pacotes novos com `npm install` sem verificar o que faz ao `package-lock.json`, certo?
O problema é que npm é um pouco flexible demais por padrão. Primeira coisa, garanta que todo mundo no time use `npm ci` no lugar de `npm install` quando tá trabalhando em um projeto já iniciado. A diferença é que `npm ci` lê exatamente o que tem em `package-lock.json` sem modificar, enquanto `install` fica fazendo upgrade de patch e minor version quando quer. Se você usa `npm install` pra adicionar coisa nova e depois faz push do lock file, os outros acabam com versões diferentes. Além disso, sempre commita o `package-lock.json` no repositório - parece óbvio mas muita gente não faz e depois fica se perguntando por que o build falha.
Para pacotes novos, usa `npm install --save-exact` se você realmente quer congelar uma versão específica, ou dá uma olhada em tools tipo `npm audit` pra verificar se tem conflitos de dependência conhecidos. Se o problema é bem grave com várias dependências aninhadas, considera também usar `npm dedupe` de vez em quando pra limpar a árvore de dependências. Na real, você também poderia tentar pnpm ou yarn se tiver a fim de mudar de ecosystem - eles gerenciam dependências de um jeito mais organizado - mas se quiser ficar com npm, respeitar o fluxo `ci` + `package-lock.json` no git deveria resolver a maioria dos problemas.