Продвинутый Git
1rebase: линейная история2stash: прячем незавершённую работу3git reset и git revert: отмена изменений4cherry-pick: перенос конкретных коммитов← вы здесь5tags: версионирование релизов6Git Workflows: GitFlow, GitHub Flow, Trunk-based
📖 Полная статья по теме →
Урок 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 E
main:    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 --abort

Cherry-pick vs merge vs rebase

Cherry-pickMergeRebase
Что переноситКонкретные коммитыВсю веткуВсю ветку
ИсторияСоздаёт копииДобавляет 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>
УГЛУБЛЁННОЕ ЧТЕНИЕ
Полная статья: Продвинутый Git
Теория, примеры и разбор темы в одном месте