Git WindowsLinuxmacOS

Git: конфликт в package-lock.json при merge

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

При объединении веток Git может записать метки конфликта в package-lock.json. Этот файл содержит полное дерево зависимостей и служебные контрольные суммы; неправильная ручная правка порой даёт формально корректный JSON, но невозможную установку. Инструкция относится к проектам npm; для yarn.lock, pnpm-lock.yaml или composer.lock нужен инструмент соответствующего менеджера.

В этой статье
  1. Что означает проблема
  2. Как отличить причины
  3. Пошаговая диагностика и решение
  4. Команды для проверки и исправления
  5. Как проверить результат и что делать, если не помогло

#Что означает проблема

При объединении веток 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, закреплённую проектом.

#Пошаговая диагностика и решение

  1. Откройте проект и посмотрите, какое слияние выполняетсяВ VS Code выберите «Файл» → «Открыть папку» с корнем проекта, затем «Терминал» → «Создать терминал». Запустите git status: должны быть записи You have unmerged paths и путь package-lock.json. Проверьте, что речь о merge, а не rebase: при rebase порядок «ours/theirs» отличается. Если рабочая папка содержит важные незакоммиченные данные, сделайте копию до продолжения. Перед остальными командами выполните git --version: в ответ должна появиться установленная версия Git. Если терминал сообщает, что git не найден, проверьте установку Git и доступность команды в этом терминале; не продолжайте операции наугад.
  2. Проверьте менеджер зависимостей и закреплённую версию NodeОткройте корневые файлы в левой панели VS Code: package.json, package-lock.json, возможные .nvmrc или поле packageManager. В терминале выполните node --version и npm --version. Если lock-файл отсутствует, а есть pnpm-lock.yaml, эта инструкция не подходит. Если в проекте закреплена версия npm, переключитесь на неё штатным менеджером версий Node по инструкциям команды, не устанавливайте случайно самый новый npm.
  3. Согласуйте package.json, если в нём есть конфликтОткройте package.json в VS Code, нажмите на строку помеченного конфликта или выберите встроенный редактор слияния. Сравните обе версии поля dependencies, devDependencies, scripts и engines, вручную сохраните нужные зависимости обеих веток, уберите все маркеры конфликта. Для файла JSON нельзя оставлять комментарии и завершающие запятые. Если версии библиотек несовместимы, согласуйте их с владельцем проекта вместо произвольного выбора.
  4. Сделайте копию lock-файла перед его пересозданиемВ проводнике файлов скопируйте package-lock.json за пределы папки проекта, например в отдельную временную папку. Это нужно, чтобы можно было сравнить точные версии. Не удаляйте существующую папку node_modules, базу данных или другие файлы только из-за конфликта: данная процедура не требует очистки.
  5. Примените разрешение конфликта через 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, вместо ручного стирания половины файла.
  6. Проверьте полученную структуру и устраните ошибкиПосле успешного завершения npm install --package-lock-only проверьте, что git diff -- package.json package-lock.json показывает ожидаемые изменения и в файлах нет <<<<<<<. Если npm сообщает ERESOLVE, не включайте постоянно --legacy-peer-deps и --force: сначала уточните конфликтующие версии пакетов и требуемую версию npm. Если lock-файл изменился полностью, возможно, у вас другая версия npm — вернитесь к согласованной.
  7. Отметьте файлы разрешёнными и проверьте установкуКогда оба файла валидны, выполните git add package.json package-lock.json и посмотрите git status. После завершения слияния выполните в подходящем рабочем окружении npm ci; он может пересоздать node_modules, поэтому до этого сохраните локальные неповторимые данные и убедитесь, что зависимостей в нём не редактировали вручную. npm ci должен завершиться без ошибки синхронизации package.json и lock-файла, затем запустите тесты проекта.
  8. Завершите слияние или отмените неудачноеЕсли git status всё ещё показывает незавершённое слияние, проверьте список файлов и создайте завершающий коммит командой git commit, когда все конфликты разрешены. Если в процессе возник риск потери чужих изменений, до завершения попробуйте git merge --abort только при обычном merge; он возвращает состояние до слияния насколько это возможно, но не заменяет сделанную копию. При rebase способ отмены другой (git rebase --abort), не путайте эти режимы.

#Команды для проверки и исправления

Linux · Терминал (Bash)Команда
Просмотр состояния и версий. Терминал в корне проекта, обычные права. Версия npm должна совпадать с принятой в команде.
git status
node --version
npm --version
Linux · Терминал (Bash)С осторожностью
Применять после исправления package.json в корне проекта. Меняет package-lock.json, но не устанавливает пакеты в node_modules. Риск средний, сохраните старый файл.
npm install --package-lock-only

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Linux · Терминал (Bash)Команда
Сначала показать различия, затем состояние. Не меняют файлы.
git diff -- package.json package-lock.json
git status
Linux · Терминал (Bash)С осторожностью
Отмечает два исправленных файла для коммита. Если файлы всё ещё содержат маркеры конфликта, сначала исправьте их.
git add package.json package-lock.json

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить результат и что делать, если не помогло

Проверка: git status не содержит unmerged paths, оба JSON разбираются, npm ci на согласованной версии npm завершается успешно, тесты приложения проходят. Если отказ связан с несовместимыми версиями библиотек, сообщите разработчику список зависимостей из npm и не отправляйте непроверенный lock-файл.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.