Как перенести один или несколько коммитов из одной ветки Git в другую

«Как перенести один или несколько коммитов из одной ветки Git в другую» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для переноса коммитов из одной ветки в другую используется команда git cherry-pick. Она применяет изменения, внесенные выбранным коммитом, создавая новый коммит в целевой ветке с тем же сообщением и автором.

Пошаговый процесс:

  1. Убедитесь, что ваша целевая ветка обновлена, и переключитесь на нее:

    # Переключаемся на ветку, куда нужно перенести коммит
    git checkout main
    git pull origin main
  2. Найдите хеш коммита, который хотите перенести (например, с помощью git log в исходной ветке).

  3. Выполните cherry-pick, указав хеш коммита:

    # abc1234 - это хеш коммита из другой ветки
    git cherry-pick abc1234

Важные сценарии и опции:

  • Перенос нескольких коммитов: Можно указать диапазон. Команда перенесет коммиты, начиная с commit_A (не включая его) и до commit_B (включительно).

    # Перенести все коммиты от commit_A до commit_B
    git cherry-pick <commit_A_hash>..<commit_B_hash>
  • Разрешение конфликтов: Если Git не может автоматически применить изменения, возникнет конфликт.

    1. Отредактируйте конфликтные файлы вручную.
    2. Добавьте их в индекс: git add <file_name>.
    3. Продолжите операцию: git cherry-pick --continue.
    4. Для отмены: git cherry-pick --abort.
  • Перенос без создания коммита: Опция -n или --no-commit применит изменения к рабочей директории, но не создаст коммит. Это полезно, если вы хотите объединить несколько cherry-pick в один коммит.

    git cherry-pick -n abc1234
    git cherry-pick -n def5678
    # Теперь можно сделать один коммит
    git commit -m "Feature from two commits"

cherry-pick — мощный инструмент для точечного переноса исправлений (например, hotfix из main в develop) или отдельных фич, но его следует использовать с осторожностью, чтобы не нарушать логику истории коммитов.