Что делает команда git cherry-pick?

«Что делает команда git cherry-pick?» — вопрос из категории DevOps, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

git cherry-pick – это команда, которая применяет изменения, внесенные в указанном коммите, к текущей ветке, создавая новый коммит с таким же набором изменений, но другим хэшем.

Основное назначение: Перенести одно или несколько конкретных изменений из одной ветки в другую без слияния всей истории ветки.

Типичный сценарий использования:

  1. В ветке feature/login был сделан важный фикс бага в коммите abc123.
  2. Вам нужно срочно применить этот фикс в ветке main, не дожидаясь полного слияния всей функциональности feature/login.

Практический пример:

# 1. Переключиться на целевую ветку
git checkout main

# 2. Найти хэш нужного коммита в исходной ветке
git log feature/login --oneline
# abc123 Fix null pointer in user validation
# def456 Add new login UI

# 3. Применить ("скопировать") изменения из коммита abc123 в текущую ветку (main)
git cherry-pick abc123
# Если конфликтов нет, будет создан новый коммит в main с теми же изменениями.

# 4. Можно применить несколько коммитов подряд (изменения применяются последовательно)
git cherry-pick abc123 def456

# 5. Отмена cherry-pick в случае конфликта или ошибки
git cherry-pick --abort

Преимущества:

  • Точность: Позволяет выбрать только нужные изменения.
  • Гибкость: Можно переносить коммиты в любом порядке, даже между несвязанными историями.

Недостатки и риски:

  • Дублирование коммитов: Создает новый коммит, что может "размыть" историю.
  • Конфликты: Высокая вероятность конфликтов, если изменения зависят от кода, отсутствующего в целевой ветке.
  • Сложность отслеживания: Усложняет понимание того, откуда пришло изменение.

Рекомендация: Используйте cherry-pick экономно, в основном для горячих фиксов или переноса изолированных патчей. Для регулярного переноса изменений предпочтительнее merge или rebase.