git cherry-pick
Перенос одного или нескольких конкретных коммитов из любой ветки в текущую — без слияния всей ветки целиком.
Зачем нужно
Иногда нужно перенести конкретное исправление или фичу из одной ветки в другую, не делая полноценный merge. Например: баг исправлен в develop, но его нужно срочно внести в release или hotfix. Cherry-pick копирует изменения нужного коммита и применяет их к текущей ветке как новый коммит с тем же сообщением.
Где используется
- Перенос hotfix из
developвreleaseилиmainбез full merge - Извлечение конкретной фичи из заброшенной ветки
- Gitflow: синхронизация fix-коммитов между параллельными ветками
- Перенос коммита, который оказался не в той ветке
Основной контент
Базовые команды
# Перенести конкретный коммит в текущую ветку
git cherry-pick abc1234
# Перенести несколько коммитов
git cherry-pick abc1234 def5678 ghi9012
# Перенести диапазон коммитов (abc1234 не включается)
git cherry-pick abc1234..def5678
# Перенести диапазон включительно (оба конца)
git cherry-pick abc1234^..def5678
# Cherry-pick без создания коммита (применить как изменения)
git cherry-pick abc1234 --no-commit
git cherry-pick abc1234 -n
Управление при конфликтах
# Если возник конфликт — разрешить и продолжить
git add src/auth.js
git cherry-pick --continue
# Пропустить конфликтный коммит
git cherry-pick --skip
# Прервать cherry-pick и вернуться к исходному состоянию
git cherry-pick --abort
Пример: перенос hotfix
# Ситуация: баг исправлен в develop, нужен в main
# 1. Найти хэш нужного коммита
git log develop --oneline
# a1b2c3d fix(auth): исправить обработку истёкшего токена ← нужен этот
# 2. Переключиться в целевую ветку
git switch main
# 3. Применить коммит
git cherry-pick a1b2c3d
# Git создаст новый коммит:
# fix(auth): исправить обработку истёкшего токена
# (cherry picked from commit a1b2c3d)
# 4. Опубликовать
git push origin main
Изменение сообщения при cherry-pick
# Применить с редактированием сообщения
git cherry-pick abc1234 --edit
# Применить изменения без коммита, написать своё сообщение
git cherry-pick abc1234 -n
git commit -m "fix(release): перенести исправление токена из develop"
Частые ошибки
- Cherry-pick нескольких связанных коммитов не по порядку — применяй от старых к новым, иначе конфликты гарантированы
- Cherry-pick вместо merge при переносе большого объёма — если нужно перенести 20+ коммитов целой фичи, merge или rebase предпочтительнее
- Дублирование коммитов — после cherry-pick в ветке появляется коммит с другим хэшем; при последующем merge исходного коммита могут возникнуть конфликты
- Не проверить, что хэш принадлежит нужной ветке —
git log --oneline branch-nameперед cherry-pick