linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/kb/Ветки и слияния/cherry-pick

kb/branching ── Ветки и слияния ── intermediate

git cherry-pick

Берёт один коммит из другой ветки и применяет его на текущую, создавая дубликат с новым SHA. Используется для hotfix'ов в нескольких релиз-ветках и переноса одиночных коммитов.

view as markdownaka: cherry

git cherry-pick <sha> берёт правку конкретного коммита и применяет её на твою ветку. Без всей истории, без merge, без rebase - только этот один коммит.

Базовая форма

bash
git switch main
git cherry-pick a1b2c3d

▸создаёт новый коммит на main с тем же содержимым,

#   что и a1b2c3d, но с новым SHA

Сообщение коммита копируется как есть. Можно добавить cherry-picked from-метку:

bash
git cherry-pick -x a1b2c3d
# Добавит в сообщение строку:
# (cherry picked from commit a1b2c3d...)

Полезно для аудита: видно, что коммит - копия другого.

Типичные сценарии

Hotfix в нескольких релизных ветках.

bash
# На main починили баг
git switch main
git commit -m "fix: handle null in user.profile"
# SHA = a1b2c3d
# Перенесли в release/v1.4
git switch release/v1.4
git cherry-pick a1b2c3d
# И в release/v1.5
git switch release/v1.5
git cherry-pick a1b2c3d

Достать полезный коммит из заброшенной ветки.

Кто-то начал ветку, забросил, ушёл. Часть коммитов оттуда пригодилась бы. Cherry-pick'аешь нужные.

Коммит ошибочно сделан не в ту ветку.

Закоммитил на main вместо feature.

bash
# Запомним SHA
LAST=$(git rev-parse HEAD)
# Откатим main на один коммит
git reset --hard HEAD~1
# Применим на feature
git switch feature
git cherry-pick $LAST

Диапазон коммитов

bash
git cherry-pick A..B          # коммиты после A до B включительно
                               # (не сам A)
git cherry-pick A^..B         # включая A

Применяются по одному, в исходном порядке. При конфликте на любом Git останавливается.

--no-commit

bash
git cherry-pick -n a1b2c3d
# Применит правку, но не закоммитит - оставит в индексе

Удобно, если хочется объединить несколько cherry-pick в один коммит:

bash
git cherry-pick -n sha1 sha2 sha3
git commit -m "backport: nullability fixes from main"

Конфликт

Разрешается как при merge или rebase:

bash
# Конфликт после cherry-pick - править файлы,
# убрать маркеры
git add <files>
git cherry-pick --continue
# или отмена:
git cherry-pick --abort

Подводные камни

  • Дубли коммитов. После cherry-pick один и тот же набор правок лежит в двух коммитах с разными SHA. При последующем merge между ветками может возникнуть «ложный» конфликт.
  • Зависимости. Cherry-pick переносит один коммит без предыдущих. Если он опирался на что-то добавленное в предыдущем коммите ветки-источника, на ветке-цели этого может не оказаться, и сборка сломается.
  • Merge-коммиты. Cherry-pick merge-коммита требует флага -m N, чтобы указать, какого родителя считать «основным». Обычно сложнее, чем кажется; чаще проще cherry-pick'нуть каждый коммит из merge'нутой ветки по отдельности.

§ команды

bash
git cherry-pick <sha>

Применить один коммит на текущую ветку

bash
git cherry-pick -x <sha>

Применить и добавить `cherry picked from` в сообщение

bash
git cherry-pick -n <sha>

Применить, но не коммитить (оставить в индексе)

bash
git cherry-pick A..B

Применить диапазон коммитов

§ см. также

  • rebasegit rebaseПереписывает коммиты ветки, делая их потомками другого коммита. Создаёт новые SHA, история становится линейной. Безопасен только для веток, которые ещё никто, кроме автора, не видел.
  • mergegit mergeСливает другую ветку в текущую. Делает либо fast-forward (двигает указатель), либо создаёт merge-коммит с двумя родителями. При пересекающихся изменениях возможны конфликты.
  • refloggit reflogЖурнал всех движений HEAD на этой машине. По умолчанию записи про достижимые коммиты живут 90 дней, про недостижимые - 30. Главный инструмент восстановления после `reset --hard`, `--amend`, `rebase` и удаления ветки. Хранится локально в `.git/logs/`.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки