Тур по Git
История и отмена изменений / Урок 3.8

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-PickMergeRebase
ОбластьОдин (или несколько) коммитовВся веткаВся ветка
ИсторияДублирует коммитДобавляет коммит слиянияВоспроизводит коммиты
ПрименениеВыборочные измененияИнтеграция ветокОчистка истории

Попробуйте!

Попрактикуйтесь в cherry-pick коммита из одной ветки в другую:

  1. Создайте начальный коммит:
    • echo "base" > file.txt && git add file.txt && git commit -m "Initial commit"
  2. Создайте feature-ветку с двумя коммитами:
    • git checkout -b feature
    • echo "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"
  3. Запомните SHA коммита "Add feature A": git log --oneline
  4. Переключитесь на main: git checkout main
  5. Выполните cherry-pick только "Add feature A": git cherry-pick <SHA> (используйте SHA из шага 3)
  6. Проверьте: git log --oneline — в main теперь есть cherry-pick коммит
  7. Проверьте: ls — вы должны видеть a.txt, но не b.txt

Cherry-pick нескольких коммитов

Вы можете выбрать несколько коммитов сразу:

git cherry-pick abc1234 def5678     # Выбрать конкретные коммиты
git cherry-pick abc1234..def5678    # Выбрать диапазон (первый не включается)
git cherry-pick abc1234^..def5678   # Выбрать диапазон (первый включается)

Разрешение конфликтов

Если cherry-pick коммит конфликтует с вашей текущей веткой:

  1. Разрешите конфликты в затронутых файлах
  2. Подготовьте разрешённые файлы: git add <файл>
  3. Продолжите: git cherry-pick --continue

Чтобы прервать: git cherry-pick --abort

Ключевые моменты

  • Cherry-pick копирует конкретный коммит в текущую ветку как новый коммит
  • Оригинальный коммит остаётся в исходной ветке — ничего не перемещается и не удаляется
  • Используйте его для выборочных изменений, когда merge или rebase принесли бы слишком много
  • Как и rebase, он создаёт новые коммиты с новыми SHA — изменения дублируются, а не перемещаются
🎯

Цель

Перенесите конкретный коммит из ветки feature в main с помощью cherry-pick

Terminal
$

No commits yet. Run `git init` and create your first commit.