← Назад к вопросам

Что такое cherry-pick в Git?

1.2 Junior🔥 111 комментариев
#Инструменты и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Git Cherry-Pick: выбирательное применение коммитов

Что такое cherry-pick

git cherry-pick — это команда Git, которая позволяет применить конкретный коммит из одной ветки к другой. Вместо объединения всей ветки (merge), ты выбираешь отдельные коммиты («вишни») и применяешь их к текущей ветке.

Базовый синтаксис

# Применить один коммит
git cherry-pick <commit-hash>

# Применить несколько коммитов по порядку
git cherry-pick <commit1> <commit2> <commit3>

# Применить диапазон коммитов
git cherry-pick <commit1>..<commit2>
# (не включает commit1, включает commit2)

git cherry-pick <commit1>^..<commit2>
# (включает оба commit1 и commit2)

# С опциями
git cherry-pick --continue    # Продолжить после разрешения конфликтов
git cherry-pick --abort       # Отменить cherry-pick
git cherry-pick -x            # Добавить ссылку на оригинальный коммит

Практические примеры

Пример 1: Критический баг fix

# Ситуация:
# develop ветка:
#   C1: Feature 1
#   C2: Feature 2
#   C3: Critical bug fix (НУЖНО В MASTER!)
#   C4: Feature 3

# master ветка:
#   A1: Old stuff
#   A2: Old stuff

# Нам нужно применить только C3 в master

# Шаг 1: Посмотреть коммиты в develop
git log develop --oneline
# abc1234 Feature 3
# def5678 Critical bug fix
# ghi9012 Feature 2
# jkl3456 Feature 1

# Шаг 2: Переключиться на master
git checkout master

# Шаг 3: Cherry-pick нужный коммит (def5678)
git cherry-pick def5678

# Если конфликтов нет — готово!
# Если есть — resolve конфликты и git cherry-pick --continue

# Результат: только bug fix применён в master

Пример 2: Применить несколько коммитов

# Нужно применить коммиты 2, 3, 4 из feature-branch в master

git log feature-branch --oneline
# commit4 Add notifications
# commit3 Add validation
# commit2 Add API endpoint
# commit1 Setup

git checkout master

# Способ 1: Три команды
git cherry-pick commit2
git cherry-pick commit3
git cherry-pick commit4

# Способ 2: Одна команда с диапазоном
git cherry-pick commit1..commit4
# (это даст commit2, commit3, commit4 т.к. commit1 не включён)

# Способ 3: С включением начального коммита
git cherry-pick commit1^..commit4
# (это даст commit1, commit2, commit3, commit4)

Конфликты при cherry-pick

# Если есть конфликты
git cherry-pick abc1234
# error: could not apply abc1234... Commit message
# hint: after resolving the conflicts, mark the resolved files with:

# Шаг 1: Посмотреть статус
git status
# On branch master
# You are currently cherry-picking commit abc1234.
# Changes by them:
#   modified:   src/utils.js

# Шаг 2: Разрешить конфликты в файлах
# Отредактировать конфликтные файлы:
# <<<<<<< HEAD
# ... текущий код ...
# =======
# ... код из cherry-pick коммита ...
# >>>>>>> abc1234

# Шаг 3: Добавить разрешённые файлы
git add src/utils.js

# Шаг 4: Продолжить
git cherry-pick --continue

# Или отменить cherry-pick
git cherry-pick --abort

# Или пропустить коммит
git cherry-pick --skip

Опция -x (рекомендуется)

# cherry-pick -x добавляет ссылку на оригинальный коммит
git cherry-pick -x def5678

# История будет содержать:
# "Critical bug fix\n\n(cherry picked from commit def5678abc...)"

# Это помогает отследить откуда пришёл коммит
git log --oneline
# abc1234 Critical bug fix (cherry picked from def5678)
# xyz9999 Old stuff

Cherry-pick vs Merge

# MERGE — объединяет ВСЮ ветку
git merge feature-branch
# Результат: все коммиты из feature-branch в master

# CHERRY-PICK — выбирает отдельные коммиты
git cherry-pick commit1 commit2
# Результат: только commit1 и commit2 в master

# Визуально:

# До merge:
#       feature
#       │   │
#       C3  C4
#       │  /
# master C1  C2
#        │  /
#       HEAD

# После merge:
#       M (merge commit)
#       │\  
# master C1  C2  C3  C4
#        │          │
#       HEAD      feature

# После cherry-pick (только C3):
# master C1  C2  C3 (копия)
#        │              │
#       HEAD           HEAD

Когда использовать cherry-pick

✅ Cherry-pick подходит:
1. Критические baggy fixes нужно срочно в production
2. Нужно отбросить некоторые коммиты из ветки
3. Синхронизировать fix между ветками
4. Перенести изменения на другую ветку (partial merge)
5. История коммитов важна (не хочешь merge commit)

❌ Не используй cherry-pick если:
1. Можешь просто merge ветку
2. Берёшь почти все коммиты (лучше merge)
3. Нужна простая история (merge чище)
4. Работаешь в большой команде (путаница с историей)

Реальный сценарий: Исправление ошибки

# develop ветка (основная разработка)
git checkout develop
git log --oneline | head -10
# abc1111 Feature X
# abc2222 Feature Y
# abc3333 Fix typo in docs
# abc4444 Add auth
# abc5555 Initial commit

# Обнаружили критический баг в production!
# Создаём hotfix от master
git checkout master
git checkout -b hotfix/critical-bug

# Исправляем баг
echo "fix" > critical_bug.js
git add critical_bug.js
git commit -m "Fix critical bug in production"

# Тестируем, всё работает, merge в master
git checkout master
git merge hotfix/critical-bug

# Но нам нужно это исправление и в develop!
# Способ 1: простой merge
git checkout develop
git merge master
# Но это добавит все коммиты из master в develop

# Способ 2: cherry-pick только нужного коммита
git checkout develop
git cherry-pick abc9999  # хеш коммита с баг фиксом

# Готово! Баг fixed и в develop и в master

Advanced: cherry-pick с edit

# --edit флаг позволяет отредактировать сообщение
git cherry-pick --edit def5678

# Откроется редактор где можно изменить сообщение
# Полезно когда применяешь коммит в другой контекст

# --no-commit — применить изменения но не коммитить
git cherry-pick --no-commit def5678
# Изменения в staging area, но нет нового коммита
# Можно добавить ещё файлов или редактировать
git add more_files
git commit -m "Custom message"

Опасность cherry-pick

# ⚠️ Cherry-pick создаёт КОПИЮ коммита
# Original commit: def5678abc
# New commit: xyz9999def (другой хеш)

# Если потом merge ветку — конфликты!
git log --oneline
# xyz9999def Fix bug (cherry-picked from def5678)
# def5678abc Fix bug (original)
# ← Два разных коммита с одними изменениями!

# Решение: использовать -x флаг
git cherry-pick -x def5678
# Git распознает что это одни и те же изменения

Выводы

  1. Cherry-pick — применяет отдельные коммиты из другой ветки
  2. Используй для критических фиксов и частичного merge
  3. Всегда используй -x чтобы отследить оригинальный коммит
  4. Конфликты решаются как при merge: resolve → add → continue
  5. Лучше использовать merge если применяешь большинство коммитов
  6. Помни что это создаёт копии коммитов (разные хеши)
Что такое cherry-pick в Git? | PrepBro