Комментарии (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 распознает что это одни и те же изменения
Выводы
- Cherry-pick — применяет отдельные коммиты из другой ветки
- Используй для критических фиксов и частичного merge
- Всегда используй -x чтобы отследить оригинальный коммит
- Конфликты решаются как при merge: resolve → add → continue
- Лучше использовать merge если применяешь большинство коммитов
- Помни что это создаёт копии коммитов (разные хеши)