Какой командой Git можно применить изменения из конкретного коммита в текущую ветку?

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

Ответ

Основная команда: git cherry-pick <commit-hash> — применяет изменения, внесенные указанным коммитом, к текущей ветке, создавая новый коммит.

Типичный сценарий использования: Вы хотите взять исправление бага из ветки develop и перенести его в ветку production, не сливая всю develop.

Пошаговый пример:

# 1. Находим хэш нужного коммита в истории (например, abc123)
git log --oneline develop

# 2. Переключаемся на целевую ветку
git checkout production

# 3. Применяем ("вишнёво выбираем") коммит
git cherry-pick abc123

Ключевые особенности и опции:

  • Создает новый коммит: Хэш нового коммита будет отличаться от исходного, хотя изменения идентичны.
  • Диапазон коммитов: Можно применить несколько коммитов подряд.
    git cherry-pick abc123^..def456 # Применяет все коммиты от abc123 (включительно) до def456
  • Разрешение конфликтов: Если изменения конфликтуют с текущим кодом, Git остановит процесс. Нужно:
    1. Разрешить конфликты вручную в файлах.
    2. Добавить исправленные файлы: git add <file>.
    3. Продолжить: git cherry-pick --continue.
  • Отмена операции:
    • git cherry-pick --abort — полностью отменить операцию и вернуть ветку в исходное состояние.
    • git cherry-pick --quit — прервать операцию, но оставить уже разрешенные конфликты и индекс.

Альтернативы и когда их использовать:

  • git merge — для интеграции всей истории ветки.
  • git rebase — для перебазирования серии коммитов (изменяет историю).

cherry-pick идеален для точечного переноса отдельных исправлений или фич между ветками.