Cuando tienes estos conflictos, generalmente pasa cuando instalas paquetes nuevos con `npm install` sin revisar qué hace con `package-lock.json`, ¿verdad?
El problema es que npm es demasiado flexible por defecto. Lo primero, asegúrate de que todos en el equipo usen `npm ci` en lugar de `npm install` cuando trabajen en un proyecto ya iniciado. La diferencia es que `npm ci` lee exactamente lo que hay en `package-lock.json` sin modificarlo, mientras que `install` se pone a hacer upgrades de versiones patch y minor cuando le da la gana. Si usas `npm install` para añadir cosas nuevas y luego pusheáis el lock file, los otros se encuentran versiones diferentes. Además, siempre commitea el `package-lock.json` en el repositorio - suena obvio pero muchos no lo hacen y después se preguntan por qué el build falla.
Para los paquetes nuevos, usa `npm install --save-exact` si quieres realmente congelar una versión específica, o echa un vistazo a herramientas como `npm audit` para verificar si hay conflictos de dependencias conocidos. Si el problema es muy grave con un montón de dependencias anidadas, considera también usar `npm dedupe` de vez en cuando para limpiar el árbol de dependencias. En realidad, podrías probar pnpm o yarn si estás dispuesto a cambiar de ecosistema - gestionan las dependencias de manera más ordenada - pero si quieres quedarte con npm, respetar el flujo `ci` + `package-lock.json` en git debería resolver la mayoría de los líos.