git cherry-pick — Выбор отдельных коммитов
Команда git cherry-pick применяет конкретный коммит из одной ветки к другой. Вместо слияния или перебазирования всей ветки вы выбираете только нужные коммиты.
Когда использовать cherry-pick
- Вам нужно одно исправление бага из другой ветки, но не всё остальное
- Коммит был сделан в неправильную ветку и его нужно применить к правильной
- Вы хотите перенести исправление из ветки разработки в ветку релиза
Как это работает
До cherry-pick:
A — B — C (main)
\
D — E — F (feature)
После git cherry-pick E (из main):
A — B — C — E' (main)
\
D — E — F (feature)
Коммит E' содержит те же изменения, что и E, но это новый коммит с новым SHA. Оригинальный коммит E остаётся в ветке feature.
Основное использование
git cherry-pick abc1234 # Применить конкретный коммит по SHA
git cherry-pick feature~1 # Применить предпоследний коммит из feature
Cherry-Pick vs Merge vs Rebase
| Cherry-Pick | Merge | Rebase | |
|---|---|---|---|
| Область | Один (или несколько) коммитов | Вся ветка | Вся ветка |
| История | Дублирует коммит | Добавляет коммит слияния | Воспроизводит коммиты |
| Применение | Выборочные изменения | Интеграция веток | Очистка истории |
Попробуйте!
Попрактикуйтесь в cherry-pick коммита из одной ветки в другую:
- Создайте начальный коммит:
echo "base" > file.txt && git add file.txt && git commit -m "Initial commit"
- Создайте feature-ветку с двумя коммитами:
git checkout -b featureecho "feature A" > a.txt && git add a.txt && git commit -m "Add feature A"echo "feature B" > b.txt && git add b.txt && git commit -m "Add feature B"
- Запомните SHA коммита "Add feature A":
git log --oneline - Переключитесь на main:
git checkout main - Выполните cherry-pick только "Add feature A":
git cherry-pick <SHA>(используйте SHA из шага 3) - Проверьте:
git log --oneline— в main теперь есть cherry-pick коммит - Проверьте:
ls— вы должны видетьa.txt, но неb.txt
Cherry-pick нескольких коммитов
Вы можете выбрать несколько коммитов сразу:
git cherry-pick abc1234 def5678 # Выбрать конкретные коммиты
git cherry-pick abc1234..def5678 # Выбрать диапазон (первый не включается)
git cherry-pick abc1234^..def5678 # Выбрать диапазон (первый включается)
Разрешение конфликтов
Если cherry-pick коммит конфликтует с вашей текущей веткой:
- Разрешите конфликты в затронутых файлах
- Подготовьте разрешённые файлы:
git add <файл> - Продолжите:
git cherry-pick --continue
Чтобы прервать: git cherry-pick --abort
Ключевые моменты
- Cherry-pick копирует конкретный коммит в текущую ветку как новый коммит
- Оригинальный коммит остаётся в исходной ветке — ничего не перемещается и не удаляется
- Используйте его для выборочных изменений, когда merge или rebase принесли бы слишком много
- Как и rebase, он создаёт новые коммиты с новыми SHA — изменения дублируются, а не перемещаются