Продвинутый Git
Урок 4~12 минут
cherry-pick: перенос конкретных коммитов
Иногда нужен один конкретный коммит с другой ветки — не весь merge, не rebase. Для этого git cherry-pick.
Что делает cherry-pick
main: A─B─C
↑ HEAD
feature: A─B─D─E─F
↑ хочу только E
bash
git switch main
git cherry-pick Emain: A─B─C─E'
↑ E' — копия E с новым хэшем
feature: A─B─D─E─F (без изменений)
E' — новый коммит с теми же изменениями что и E, но другим хэшем (другой родитель).
Когда использовать
Hotfix на нескольких ветках — починил баг в main, нужно то же самое в release/2.0:
bash
git switch release/2.0
git cherry-pick abc1234 # хэш коммита с фиксомСпасение работы с заброшенной ветки — ветку закрыли, но пара коммитов была полезной:
bash
git cherry-pick def5678Перенос нескольких коммитов
bash
# Один коммит
git cherry-pick abc1234
# Диапазон (A не включается, B включается)
git cherry-pick A..B
# Несколько конкретных
git cherry-pick abc1234 def5678 ghi9012
# Диапазон включая первый
git cherry-pick A^..BПопробуй в симуляции
Кликни на коммит в нижней ветке — он перенесётся на main. Обрати внимание: оригинальный коммит остаётся на месте.
Флаг --no-commit
bash
git cherry-pick abc1234 --no-commit
# изменения попадают в staging, коммит не создаётся
git status # посмотреть что изменилось
git commit -m "cherry-pick: перенёс фикс авторизации"Удобно когда хочешь объединить несколько cherry-pick в один коммит или проверить результат перед коммитом.
Конфликты
Cherry-pick может вызвать конфликт — те же изменения, разная история:
bash
git cherry-pick abc1234
# CONFLICT! Файл изменился в обеих ветках
# Разрешаешь конфликт в редакторе...
git add файл
git cherry-pick --continue # продолжить
# Или отменить:
git cherry-pick --abortCherry-pick vs merge vs rebase
| Cherry-pick | Merge | Rebase | |
|---|---|---|---|
| Что переносит | Конкретные коммиты | Всю ветку | Всю ветку |
| История | Создаёт копии | Добавляет merge commit | Переписывает |
| Когда | Нужен 1-2 коммита | Нужна вся работа | Линейная история |
Команды
bash
git cherry-pick <hash> # один коммит
git cherry-pick A..B # диапазон
git cherry-pick <hash> -n # без коммита
git cherry-pick --continue # после конфликта
git cherry-pick --abort # отменить
git cherry-pick --quit # бросить, не откатыватьcherry-pick — это копирование коммита. Оригинал остаётся на месте, на целевой ветке появляется новый коммит с теми же изменениями.
main ← текущая ветка
a1b2c3
init: проект создан
b2c3d4
feat: авторизация
H
↓ Кликни на коммит в feature-ветке чтобы cherry-pick его на main
feature
c3d4e5
feat: новый дашборд
🍒 pick
d4e5f6
fix: критический баг в API
🍒 pick
e5f6a7
feat: экспорт в PDF
🍒 pick
git cherry-pick <hash>