На Mac разрешите конфликт при cherry-pick, отредактировав каждый конфликтный файл в Терминале или редакторе кода, добавив готовые файлы в индекс с помощью git add и выполнив команду git cherry-pick --continue. Git приостанавливает работу, поскольку не смог применить коммит чисто; ваша текущая ветка еще не получила этот коммит. Проверьте обе стороны каждого конфликта перед продолжением и используйте git cherry-pick --abort, если решите отказаться от операции. В документации по Git cherry-pick описано это состояние паузы и варианты его продолжения.

1. Откройте Терминал в папке проекта

Откройте Терминал через Spotlight или в Finder: папка «Программы» > «Утилиты». В Терминале перейдите в папку репозитория с помощью команды cd и пути к ней. Если путь к папке содержит пробелы, заключите его в кавычки, например cd "/Users/sam/Work/My Project". Вы также можете ввести cd с пробелом на конце, перетащить папку проекта из Finder в окно Терминала и нажать клавишу Return. Apple описывает Терминал как интерфейс командной строки macOS; его приглашение ко вводу часто заканчивается знаком % при использовании командной оболочки zsh по умолчанию. В руководстве Apple по Терминалу объясняется, как его открыть и как выглядит строка приглашения.

Убедитесь, что вы находитесь в репозитории, и проверьте отчет Git перед изменением файлов:

git status

Если в выводе указано, что выполняется cherry-pick, и перечислены пути с конфликтами, продолжайте следовать инструкциям ниже. Если вы не уверены, какой именно репозиторий или коммит задействован, остановитесь и уточните этот контекст перед разрешением каких-либо конфликтов. Не запускайте второй cherry-pick, пока первый находится на паузе.

2. Изучите конфликт и определите, каким должно быть содержимое файла

Откройте каждый конфликтный текстовый файл в своем редакторе. Git вставляет маркеры вокруг фрагментов, которые он не смог согласовать автоматически. Типичный фрагмент выглядит следующим образом:

<<<<<<< HEAD
content on the current branch
=======
content from the commit being cherry-picked
>>>>>>> commit subject or identifier

HEAD — это версия из текущей ветки; другой фрагмент взят из применяемого коммита. Эти метки описывают две стороны операции, но не указывают, какая из версий правильная. Используйте окружающий код, предполагаемые изменения и цель коммита, чтобы решить, оставить ли одну из сторон или объединить их. В документации Git объясняется, что конфликтные файлы содержат маркеры, а пути, применившиеся без конфликтов, возможно, уже обновлены. Git cherry-pick

Отредактируйте файл так, чтобы он содержал требуемый итоговый результат, удалив все строки с маркерами конфликта. Проверьте каждый конфликт в этом файле, сохраните его и повторите процедуру для каждого пути, указанного командой git status. Для бинарного файла или конфликта, итоговый результат которого неясен, не угадывайте наугад: проконсультируйтесь с автором изменений или обратитесь к руководству по проекту перед выбором версии. Избегайте полной замены файла одной из сторон только для того, чтобы убрать конфликт — это может привести к потере нужных изменений.

3. Добавьте разрешенные файлы в индекс и проверьте их

После разрешения конфликтов в файле сообщите Git, что конфликт устранен, добавив файл в индекс (stage). Используйте точный путь, показанный командой git status; заключайте пути с пробелами в кавычки:

git add "Sources/Example File.swift"

Повторите это для каждого разрешенного пути. Команда git add индексирует текущее содержимое файла, поэтому проверьте, что именно вы индексируете, если файл содержит посторонние правки. В руководстве по команде Git git-add указано, что она добавляет содержимое файлов в индекс — область подготовки для следующего коммита. Git add

Убедитесь, что неразрешенных конфликтов не осталось, и просмотрите проиндексированные изменения:

git status
git diff --cached

Команда git status больше не должна выводить список неразрешенных путей. Ознакомьтесь с проиндексированным diff и убедитесь, что присутствуют все нужные изменения, а маркеры конфликтов и случайные правки отсутствуют. Команда git diff --cached отображает изменения в индексе; эта опция проверки описана в документации Git diff. Если вы обнаружили ошибку, отредактируйте файл, снова добавьте его в индекс и еще раз проверьте diff.

4. Продолжите выполнение cherry-pick

Когда все конфликты разрешены и проиндексированы, выполните:

git cherry-pick --continue

Git возобновит приостановленную операцию и при успешном завершении запишет перенесенное изменение как новый коммит. Если Git откроет текстовый редактор для сообщения коммита, сохраните изменения и закройте его стандартными средствами этого редактора. Затем проверьте git status и при необходимости просмотрите последний коммит:

git status
git log -1 --oneline

При переносе последовательности коммитов команда --continue переходит к следующим шагам операции; последующий коммит также может остановиться из-за конфликтов. Разрешите и проиндексируйте конфликты этого коммита точно так же. В документации Git описаны параметры --continue для возобновления прерванного cherry-pick и --skip для пропуска текущего коммита. Используйте команду --skip только тогда, когда вы намеренно хотите исключить изменение из этого коммита, а не как быстрый способ обойти неразрешенные файлы. Параметры Git cherry-pick

Если вместо этого вы хотите прервать операцию

Если вы решили, что операцию cherry-pick продолжать не следует, выполните команду git cherry-pick --abort. В документации Git указано, что она отменяет операцию и возвращает состояние репозитория к тому, каким оно было до начала последовательности команд. Если перед запуском у вас были локальные изменения, проверьте их после отмены с помощью git status; не используйте деструктивные команды сброса (reset) вместо понимания текущего состояния. Git cherry-pick

Полезное эмпирическое правило просто: продолжайте только после того, как поймете необходимое содержимое каждого конфликтного файла и проверите проиндексированный результат. Если замысел кода неясен, сохраните состояние паузы и обратитесь за рекомендациями по проекту перед созданием коммита.

Источники