#Что означает проблема
При объединении веток Git может записать метки конфликта в package-lock.json. Этот файл содержит полное дерево зависимостей и служебные контрольные суммы; неправильная ручная правка порой даёт формально корректный JSON, но невозможную установку. Инструкция относится к проектам npm; для yarn.lock, pnpm-lock.yaml или composer.lock нужен инструмент соответствующего менеджера.
#Как отличить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Обе ветки изменили зависимостиВ каждой ветке обновились версии пакетов или npm и структура lock-файла. | git status помечает package-lock.json как both modified. | Согласовать package.json, затем позволить npm восстановить дерево. |
| Конфликт есть в package.jsonСостав требуемых пакетов противоречив и его сначала должен решить разработчик. | В package.json остались метки <<<<<<< или нестыковки версий. | Согласовать версии без выдуманного удаления зависимостей. |
| Не совпадают версии npm или требования проектаРазные поколения npm создают отличающиеся форматы lockfile. | npm --version у разработчиков различается, после установки меняется большая часть файла. | Использовать версию Node/npm, закреплённую проектом. |
#Пошаговая диагностика и решение
- Откройте проект и посмотрите, какое слияние выполняетсяВ VS Code выберите «Файл» → «Открыть папку» с корнем проекта, затем «Терминал» → «Создать терминал». Запустите
git status: должны быть записиYou have unmerged pathsи путьpackage-lock.json. Проверьте, что речь оmerge, а неrebase: при rebase порядок «ours/theirs» отличается. Если рабочая папка содержит важные незакоммиченные данные, сделайте копию до продолжения. Перед остальными командами выполнитеgit --version: в ответ должна появиться установленная версия Git. Если терминал сообщает, чтоgitне найден, проверьте установку Git и доступность команды в этом терминале; не продолжайте операции наугад. - Проверьте менеджер зависимостей и закреплённую версию NodeОткройте корневые файлы в левой панели VS Code:
package.json,package-lock.json, возможные.nvmrcили полеpackageManager. В терминале выполнитеnode --versionиnpm --version. Если lock-файл отсутствует, а естьpnpm-lock.yaml, эта инструкция не подходит. Если в проекте закреплена версия npm, переключитесь на неё штатным менеджером версий Node по инструкциям команды, не устанавливайте случайно самый новый npm. - Согласуйте package.json, если в нём есть конфликтОткройте
package.jsonв VS Code, нажмите на строку помеченного конфликта или выберите встроенный редактор слияния. Сравните обе версии поляdependencies,devDependencies,scriptsиengines, вручную сохраните нужные зависимости обеих веток, уберите все маркеры конфликта. Для файла JSON нельзя оставлять комментарии и завершающие запятые. Если версии библиотек несовместимы, согласуйте их с владельцем проекта вместо произвольного выбора. - Сделайте копию lock-файла перед его пересозданиемВ проводнике файлов скопируйте
package-lock.jsonза пределы папки проекта, например в отдельную временную папку. Это нужно, чтобы можно было сравнить точные версии. Не удаляйте существующую папкуnode_modules, базу данных или другие файлы только из-за конфликта: данная процедура не требует очистки. - Примените разрешение конфликта через npmЕсли уже исправлен
package.json, попробуйтеnpm install --package-lock-onlyиз корня проекта. Параметр обновляет только lock-файл, не устанавливая зависимости вnode_modules; npm умеет объединять некоторые конфликты lock-файла. Если npm не смог разобрать конфликтующие маркеры, сначала получите с команды согласованный план восстановления и сохраните обе исходные версии черезgit show :2:package-lock.jsonиgit show :3:package-lock.json, вместо ручного стирания половины файла. - Проверьте полученную структуру и устраните ошибкиПосле успешного завершения
npm install --package-lock-onlyпроверьте, чтоgit diff -- package.json package-lock.jsonпоказывает ожидаемые изменения и в файлах нет<<<<<<<. Если npm сообщает ERESOLVE, не включайте постоянно--legacy-peer-depsи--force: сначала уточните конфликтующие версии пакетов и требуемую версию npm. Если lock-файл изменился полностью, возможно, у вас другая версия npm — вернитесь к согласованной. - Отметьте файлы разрешёнными и проверьте установкуКогда оба файла валидны, выполните
git add package.json package-lock.jsonи посмотритеgit status. После завершения слияния выполните в подходящем рабочем окруженииnpm ci; он может пересоздатьnode_modules, поэтому до этого сохраните локальные неповторимые данные и убедитесь, что зависимостей в нём не редактировали вручную.npm ciдолжен завершиться без ошибки синхронизацииpackage.jsonи lock-файла, затем запустите тесты проекта. - Завершите слияние или отмените неудачноеЕсли
git statusвсё ещё показывает незавершённое слияние, проверьте список файлов и создайте завершающий коммит командойgit commit, когда все конфликты разрешены. Если в процессе возник риск потери чужих изменений, до завершения попробуйтеgit merge --abortтолько при обычном merge; он возвращает состояние до слияния насколько это возможно, но не заменяет сделанную копию. При rebase способ отмены другой (git rebase --abort), не путайте эти режимы.
#Команды для проверки и исправления
git statusnode --versionnpm --versionpackage.json в корне проекта. Меняет package-lock.json, но не устанавливает пакеты в node_modules. Риск средний, сохраните старый файл.npm install --package-lock-onlyКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
git diff -- package.json package-lock.jsongit statusgit add package.json package-lock.jsonКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат и что делать, если не помогло
Проверка: git status не содержит unmerged paths, оба JSON разбираются, npm ci на согласованной версии npm завершается успешно, тесты приложения проходят. Если отказ связан с несовместимыми версиями библиотек, сообщите разработчику список зависимостей из npm и не отправляйте непроверенный lock-файл.