Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
git cherry-pick — применение отдельного коммита
cherry-pick — это команда Git, которая позволяет применить изменения из определённого коммита одной ветки к другой ветке, не включая остальные коммиты между ними. Это полезно, когда нужно скопировать конкретный коммит.
Базовый синтаксис
# Применить конкретный коммит к текущей ветке
git cherry-pick <commit-hash>
# Применить несколько коммитов подряд
git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3>
# Применить диапазон коммитов
git cherry-pick <commit-hash-start>..<commit-hash-end>
Когда использовать cherry-pick
1. Срочный фиксь в продакшене (hotfix branch)
Вы разработали фиксь на ветке feature, но нужно срочно применить его к main или production:
# На ветке feature
git log --oneline
# 123abc Fix critical bug in payment
# 456def Add new feature
# Переходим на production
git checkout production
# Применяем только фиксь, не добавляем новую фичу
git cherry-pick 123abc
# Теперь production имеет фиксь, но не новую фичу
2. Случайный коммит на неправильной ветке
Вы закоммитили изменения на main вместо feature:
# Текущее состояние
git log --oneline
# 789ghi Fix bug (случайно на main)
# 456def Previous commit
# Создаём новую ветку с этим коммитом
git checkout -b feature/fix
# Возвращаемся на main и откатываем коммит
git checkout main
git reset --hard 456def
# Теперь fix есть на feature и main вернулась в исходное состояние
3. Переиспользование кода из другой ветки
Вы разработали утилиту на ветке utils, и она нужна в другие проекте:
# На основной ветке проекта A
git cherry-pick project-b-branch:abc1234
# Коммит с утилитой теперь в проекте A
4. Выбор лучших коммитов из экспериментальной ветки
Вы экспериментировали и хотите взять только работающие части:
# На экспериментальной ветке есть несколько коммитов
git log --oneline
# exp123 Working algorithm
# exp456 Failed approach (не нужен)
# exp789 Performance improvement
# На основной ветке берём только нужные
git checkout main
git cherry-pick exp123 exp789
Примеры использования
Пример 1: Простой cherry-pick
# Смотрим коммиты в другой ветке
git log feature/new-api --oneline
# a1b2c3d Add API endpoint for users
# d4e5f6g Update documentation
# Переходим на main
git checkout main
# Берём только один коммит
git cherry-pick a1b2c3d
# Результат: main теперь имеет коммит с API endpoint
Пример 2: Несколько коммитов
# Применяем три конкретных коммита
git cherry-pick abc1 def2 ghi3
# Если конфликты, разрешаем их и продолжаем
git add .
git cherry-pick --continue
Пример 3: Диапазон коммитов
# Берём все коммиты от commit1 до commit2 (exclusive..inclusive)
git cherry-pick commit1..commit2
# Или включаем оба конца
git cherry-pick commit1^..commit2
Пример 4: Конфликты при cherry-pick
# Начинаем cherry-pick
git cherry-pick abc123
# Если конфликты:
# CONFLICT (content): Merge conflict in file.py
# Разрешаем конфликты вручную, затем
git add file.py
# Продолжаем операцию
git cherry-pick --continue
# Или отменяем
git cherry-pick --abort
Cherry-pick vs другие подходы
Cherry-pick vs Merge
# Merge — берёт ВСЕ коммиты из ветки
git checkout main
git merge feature
# Результат: в main все коммиты из feature
# Cherry-pick — берёт КОНКРЕТНЫЕ коммиты
git cherry-pick feature-commit-1 feature-commit-2
# Результат: в main только выбранные коммиты
Cherry-pick vs Rebase
# Rebase — переписывает историю ветки
git rebase main
# Переносит ВСЕ коммиты текущей ветки поверх main
# Cherry-pick — применяет коммиты к текущей ветке
git cherry-pick main~2..main
# Берёт два последних коммита из main и применяет их
Сложные случаи
Пример 5: Cherry-pick с редактированием коммита
# Применяем коммит и открываем редактор сообщения
git cherry-pick --edit abc123
# Редактируем сообщение коммита перед применением
Пример 6: Cherry-pick без создания нового коммита
# Применяем изменения, но не создаём коммит
git cherry-pick --no-commit abc123
# Теперь можно отредактировать и сделать свой коммит
git add .
git commit -m "My custom message"
Пример 7: Cherry-pick из другого репозитория
# Добавляем удалённый репозиторий
git remote add other-repo https://github.com/user/other-repo.git
git fetch other-repo
# Берём коммит из другого репо
git cherry-pick other-repo/main~2
Когда избегать cherry-pick
НЕ используй cherry-pick когда:
- Нужна полная интеграция ветки — используй
mergeилиrebase - Много зависимых коммитов — это создаст проблемы с логикой
- Нарушаешь историю ветки — когда cherry-pick применяется в обе стороны (diverged history)
- На публичной ветке — переписывание коммитов может помешать другим
# Плохо: создание diverged history
# На ветке A
git cherry-pick B-commit
# На ветке B
git cherry-pick A-commit # Проблемы с историей!
Best Practices
- Используй cherry-pick для hotfix — срочные фиксы в production
- Документируй почему — добавляй контекст в сообщение коммита
- Избегай cherry-pick в обе стороны — это нарушает историю
- Предпочитай merge/rebase — если нужно интегрировать всю ветку
- Тестируй после cherry-pick — убедись что код работает
# Хорошая практика: hotfix с cherry-pick
git checkout -b hotfix/critical-bug
git commit -m "Fix critical payment bug (closes #123)"
# Применяем на production
git checkout production
git cherry-pick hotfix/critical-bug
# Применяем на main
git checkout main
git cherry-pick hotfix/critical-bug
# Удаляем ветку
git branch -d hotfix/critical-bug
Ключевые моменты
- cherry-pick применяет конкретный коммит к текущей ветке
- Используется для hotfix, срочных фиксей, и выбора коммитов
- Отличается от merge — берёт конкретные коммиты, а не всю ветку
- Может создавать конфликты — нужно разрешать вручную
- Не используй для полной интеграции — это задача для merge/rebase
- Избегай diverged history — не cherry-pick в обе стороны