← Назад к вопросам

Когда используется git cherry-pick?

2.0 Middle🔥 121 комментариев
#Git и VCS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

git cherry-pick — применение отдельного коммита

cherry-pick — это команда Git, которая позволяет применить изменения из определённого коммита одной ветки к другой ветке, не включая остальные коммиты между ними. Это полезно, когда нужно скопировать конкретный коммит.

Базовый синтаксис

# Применить конкретный коммит к текущей ветке
git cherry-pick <commit-hash>

# Применить несколько коммитов подряд
git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3>

# Применить диапазон коммитов
git cherry-pick <commit-hash-start>..<commit-hash-end>

Когда использовать cherry-pick

1. Срочный фиксь в продакшене (hotfix branch)

Вы разработали фиксь на ветке feature, но нужно срочно применить его к main или production:

# На ветке feature
git log --oneline
# 123abc Fix critical bug in payment
# 456def Add new feature

# Переходим на production
git checkout production

# Применяем только фиксь, не добавляем новую фичу
git cherry-pick 123abc

# Теперь production имеет фиксь, но не новую фичу

2. Случайный коммит на неправильной ветке

Вы закоммитили изменения на main вместо feature:

# Текущее состояние
git log --oneline
# 789ghi Fix bug (случайно на main)
# 456def Previous commit

# Создаём новую ветку с этим коммитом
git checkout -b feature/fix

# Возвращаемся на main и откатываем коммит
git checkout main
git reset --hard 456def

# Теперь fix есть на feature и main вернулась в исходное состояние

3. Переиспользование кода из другой ветки

Вы разработали утилиту на ветке utils, и она нужна в другие проекте:

# На основной ветке проекта A
git cherry-pick project-b-branch:abc1234

# Коммит с утилитой теперь в проекте A

4. Выбор лучших коммитов из экспериментальной ветки

Вы экспериментировали и хотите взять только работающие части:

# На экспериментальной ветке есть несколько коммитов
git log --oneline
# exp123 Working algorithm
# exp456 Failed approach (не нужен)
# exp789 Performance improvement

# На основной ветке берём только нужные
git checkout main
git cherry-pick exp123 exp789

Примеры использования

Пример 1: Простой cherry-pick

# Смотрим коммиты в другой ветке
git log feature/new-api --oneline
# a1b2c3d Add API endpoint for users
# d4e5f6g Update documentation

# Переходим на main
git checkout main

# Берём только один коммит
git cherry-pick a1b2c3d

# Результат: main теперь имеет коммит с API endpoint

Пример 2: Несколько коммитов

# Применяем три конкретных коммита
git cherry-pick abc1 def2 ghi3

# Если конфликты, разрешаем их и продолжаем
git add .
git cherry-pick --continue

Пример 3: Диапазон коммитов

# Берём все коммиты от commit1 до commit2 (exclusive..inclusive)
git cherry-pick commit1..commit2

# Или включаем оба конца
git cherry-pick commit1^..commit2

Пример 4: Конфликты при cherry-pick

# Начинаем cherry-pick
git cherry-pick abc123

# Если конфликты:
# CONFLICT (content): Merge conflict in file.py

# Разрешаем конфликты вручную, затем
git add file.py

# Продолжаем операцию
git cherry-pick --continue

# Или отменяем
git cherry-pick --abort

Cherry-pick vs другие подходы

Cherry-pick vs Merge

# Merge — берёт ВСЕ коммиты из ветки
git checkout main
git merge feature
# Результат: в main все коммиты из feature

# Cherry-pick — берёт КОНКРЕТНЫЕ коммиты
git cherry-pick feature-commit-1 feature-commit-2
# Результат: в main только выбранные коммиты

Cherry-pick vs Rebase

# Rebase — переписывает историю ветки
git rebase main
# Переносит ВСЕ коммиты текущей ветки поверх main

# Cherry-pick — применяет коммиты к текущей ветке
git cherry-pick main~2..main
# Берёт два последних коммита из main и применяет их

Сложные случаи

Пример 5: Cherry-pick с редактированием коммита

# Применяем коммит и открываем редактор сообщения
git cherry-pick --edit abc123

# Редактируем сообщение коммита перед применением

Пример 6: Cherry-pick без создания нового коммита

# Применяем изменения, но не создаём коммит
git cherry-pick --no-commit abc123

# Теперь можно отредактировать и сделать свой коммит
git add .
git commit -m "My custom message"

Пример 7: Cherry-pick из другого репозитория

# Добавляем удалённый репозиторий
git remote add other-repo https://github.com/user/other-repo.git
git fetch other-repo

# Берём коммит из другого репо
git cherry-pick other-repo/main~2

Когда избегать cherry-pick

НЕ используй cherry-pick когда:

  1. Нужна полная интеграция ветки — используй merge или rebase
  2. Много зависимых коммитов — это создаст проблемы с логикой
  3. Нарушаешь историю ветки — когда cherry-pick применяется в обе стороны (diverged history)
  4. На публичной ветке — переписывание коммитов может помешать другим
# Плохо: создание diverged history
# На ветке A
git cherry-pick B-commit

# На ветке B
git cherry-pick A-commit  # Проблемы с историей!

Best Practices

  1. Используй cherry-pick для hotfix — срочные фиксы в production
  2. Документируй почему — добавляй контекст в сообщение коммита
  3. Избегай cherry-pick в обе стороны — это нарушает историю
  4. Предпочитай merge/rebase — если нужно интегрировать всю ветку
  5. Тестируй после cherry-pick — убедись что код работает
# Хорошая практика: hotfix с cherry-pick
git checkout -b hotfix/critical-bug
git commit -m "Fix critical payment bug (closes #123)"

# Применяем на production
git checkout production
git cherry-pick hotfix/critical-bug

# Применяем на main
git checkout main
git cherry-pick hotfix/critical-bug

# Удаляем ветку
git branch -d hotfix/critical-bug

Ключевые моменты

  • cherry-pick применяет конкретный коммит к текущей ветке
  • Используется для hotfix, срочных фиксей, и выбора коммитов
  • Отличается от merge — берёт конкретные коммиты, а не всю ветку
  • Может создавать конфликты — нужно разрешать вручную
  • Не используй для полной интеграции — это задача для merge/rebase
  • Избегай diverged history — не cherry-pick в обе стороны