#Как проявляется ошибка и когда применим способ
При git cherry-pick одного коммита в другую ветку могут возникнуть конфликты в нескольких файлах. Git останавливает перенос и ждёт ручного разрешения; нельзя автоматически выбрать одну сторону для всех файлов, если часть изменений важна в обеих ветках.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Изменения перекрываютсяВ переносимом коммите и целевой ветке изменены одни строки. | В файлах есть маркеры <<<<<<<, =======, >>>>>>>. | Разобрать конфликт по каждому файлу. |
| Файл удалён или переименованОдин коммит удалил файл, другой продолжил его менять. | git status сообщает modify/delete либо rename conflict. | Решить судьбу файла на основании требований проекта. |
#Пошаговая диагностика и решение
- 1. Остановите перенос и сохраните список конфликтовВ терминале репозитория выполните git status и git diff --name-only --diff-filter=U. Запишите все файлы с конфликтами; Git ещё не завершил cherry-pick. Не запускайте второй cherry-pick поверх незавершённого и не используйте git reset --hard для очистки.
- Чтение состояния операции и списка неразрешённых путейLinux · Терминал (Bash)КомандаЧтение состояния операции и списка неразрешённых путей.
git statusgit diff --name-only --diff-filter=U
- 2. Сохраните копию спорных файловПеред ручным редактированием скопируйте конфликтующие файлы вне репозитория или сделайте копию всей рабочей папки. Если перенос оказался ошибкой, git cherry-pick --abort обычно возвращает состояние до начала операции, но внешний архив поможет сохранить ценные ручные исправления.
- 3. Проверьте исходный коммит и целевую веткуОткройте историю и нужный переносимый коммит командой git show ХЕШ --stat. Убедитесь, что хеш тот, который нужно было переносить, и что коммит не являлся сложным merge, требующим особого выбора родителя. Если переносить его не требуется, безопаснее abort.
- Читает состав переносимого коммита; подставьте исходный хешLinux · Терминал (Bash)КомандаЧитает состав переносимого коммита; подставьте исходный хеш.
git show ХЕШ --stat
- 4. Разрешите первый файл вручнуюОткройте файл с конфликтом в редакторе VS Code или другом текстовом редакторе. Найдите маркеры конфликта, сравните обе версии, оставьте требуемую комбинацию строк и удалите маркеры. Для текстовых файлов проверяйте синтаксис; для бинарных файлов понадобится выбор проверенной версии целиком.
- 5. Повторите для остальных файлов и отметьте решениеПосле решения каждого файла выполните git add -- ПУТЬ_К_ФАЙЛУ, затем снова git diff --name-only --diff-filter=U. Повторяйте только для проверенных файлов; если их много, не используйте git add . без контроля, чтобы случайно не захватить секреты.
- Добавляет выбранный исправленный файл в индекс; замените путьLinux · Терминал (Bash)С осторожностьюДобавляет выбранный исправленный файл в индекс; замените путь.
git add -- ПУТЬ_К_ФАЙЛУgit diff --name-only --diff-filter=UКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 6. Завершите перенос только после проверкиКогда список конфликтов пуст, выполните предусмотренные проектом тесты или проверку компиляции, затем git cherry-pick --continue. Если тесты провалились, сначала поправьте код и повторите проверку. При необходимости полного отказа воспользуйтесь git cherry-pick --abort до завершения.
- Завершает перенос и создаёт коммит; может открыть редактор сообщенияLinux · Терминал (Bash)С осторожностьюЗавершает перенос и создаёт коммит; может открыть редактор сообщения. Выполняйте после разрешения конфликтов.
git cherry-pick --continueКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Проверьте итоговую историю и кодВыполните git status и git log -3 --oneline, убедитесь, что создался нужный коммит и не осталось незавершённой операции. Сравните изменения перенесённого коммита с ожиданиями. Если случайно выбрана неверная версия файла, не отправляйте коммит на сервер до исправления.
#Проверка результата и действия при повторении
Перенос завершён, git status не показывает конфликтов или незавершённого cherry-pick, тесты проходят и полученный коммит сохраняет необходимые изменения обеих веток. При невозможности разрешить конфликт безопасно прервите перенос до публикации.
Если на указанном шаге результат отличается, остановитесь и запишите первое полное сообщение об ошибке, версию инструментов и проверенное состояние до исправления. Не переходите к опасным действиям на действующем проекте: повторите проверку на отдельной копии, верните сохранённые файлы и только затем выбирайте следующую причину.