Чтобы выполнить cherry-pick зависимых коммитов на macOS, сначала определите коммит-пререквизит и примените его перед тем коммитом, который от него зависит. В Терминале просмотрите историю исходной ветки, убедитесь, что в целевой ветке чистый рабочий каталог (working tree), а затем выполните cherry-pick выбранных ID коммитов в порядке их зависимостей. Git применяет изменения каждого коммита и создает новый коммит в ветке, которая у вас сейчас активна; он не определяет автоматически, какие изменения требуются вашей целевой ветке. Документация по git cherry-pick

В каком порядке следует применять зависимые коммиты?

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

Используйте порядок коммитов «от родительского к дочернему» в исходной ветке в качестве отправной точки. Рекомендации Git по организации рабочего процесса (workflows) советуют разделять работу на логические коммиты, которые самодостаточны и могут работать независимо друг от друга; реальная история может не соответствовать этому идеалу, поэтому проверяйте, что именно изменяет каждый выбранный коммит и от чего он зависит. Cherry-picking копирует изменения коммитов по отдельности, в то время как слияние (merge) переносит изменения на уровне всей ветки. Если вам нужна вся ветка целиком вместе с её историей, подумайте, не подойдет ли слияние лучше, чем перенос коммитов по одному. Документация по рабочим процессам Git

Просмотр истории в Терминале

Откройте Терминал на своем Mac, перейдите в папку репозитория и проверьте текущее состояние. Замените путь в кавычках фактическим путем к вашему репозиторию; кавычки позволяют обрабатывать пробелы в именах папок.

cd "/path/to/your/repository"
git status --short --branch
git log --graph --oneline --decorate --all

Первая команда меняет рабочий каталог Терминала. git status показывает текущую активную ветку и любые локальные изменения. Графическое представление позволяет увидеть, какие коммиты находятся в исходной ветке, и их порядок. В Терминале macOS по умолчанию используется zsh, а приведенные выше команды используют обычный синтаксис командной оболочки, который им поддерживается. Руководство Apple по Терминалу

Если нужная ветка является удаленной отслеживаемой веткой и ее последнее состояние отсутствует локально, выполните fetch перед просмотром:

git fetch origin
git log --reverse --oneline origin/feature-name

Замените origin/feature-name фактическим именем удаленной ветки. Параметр --reverse отображает коммиты в хронологическом порядке: от старых к новым. Если история очень большая, ограничьте вывод лога коммитами после известной общей базы, например git log --reverse --oneline base-commit..origin/feature-name. Прочтите полученные названия коммитов, затем изучите изменения коммитов-кандидатов с помощью git show COMMIT_ID. Диапазон коммитов удобен для просмотра, но не стоит полагаться на то, что сам аргумент диапазона гарантирует необходимый вам порядок зависимостей: явное указание ID коммитов делает нужную последовательность однозначной.

Выполнение cherry-pick в порядке зависимостей

Перед началом закоммитьте или надежно отложите (stash) локальные изменения. Для стандартной операции cherry-pick требуется чистый рабочий каталог, и перед применением изменений следует убедиться, что вы находитесь в правильной целевой ветке. Замените примеры ID фактическими полными или сокращенными ID коммитов, упорядоченными от пререквизита к зависимому:

git switch destination-branch
git status --short --branch
git cherry-pick a1b2c3 d4e5f6

Git создает новый коммит для каждого выбранного изменения в указанном порядке. Внимательно проверьте вывод: если изменение уже было включено другим путем или целевая ветка разошлась с исходной, Git может сообщить о пустом изменении или остановиться из-за конфликта. После этого проверьте полученную историю и рабочий каталог с помощью git log --oneline -n 5 и git status. Запустите соответствующие проверки проекта, прежде чем полагаться на результат: успешный cherry-pick означает лишь то, что Git применил изменения, но не гарантирует, что функциональность работает так, как предполагалось.

Если коммит приводит к конфликту

Когда при переносе коммита возникает конфликт, Git приостанавливает выполнение на этом коммите. Проверьте затронутые файлы и разрешите каждый конфликт, объединив предполагаемое исходное изменение с текущим содержимым целевой ветки. Добавьте разрешенные файлы в индекс с помощью git add и продолжите последовательность:

git add "path/to/resolved-file"
git cherry-pick --continue

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

Если коммит является коммитом слияния (merge commit), остановитесь перед его выбором: Git потребует указать родительскую ветку основной линии (mainline parent), так как у такого коммита более одного родителя. Аналогично, если последующие коммиты нельзя понять без длинной цепочки более ранних изменений, выбор лишь нескольких из них может не дать целостного результата. Изучите зависимости и выберите наименьшую полную последовательность, которая их сохраняет.

Источники