Ответ
git cherry-pick применяет изменения из указанного существующего коммита в текущую ветку, создавая при этом новый коммит. Это полезно для переноса конкретного исправления или фичи без слияния всей истории другой ветки.
Типичный сценарий из моей практики: Допустим, я нашел и исправил критический баг в ветке develop, сделав коммит abc123. Мне нужно срочно применить это же исправление в ветке production, которая отстает по версии.
# 1. Перехожу в ветку, куда нужно перенести исправление
$ git checkout production
# 2. "Выбираю" нужный коммит из develop
$ git cherry-pick abc123
Git попытается применить патч из коммита abc123. Если изменений в коде между ветками нет, операция пройдет успешно, и в production появится новый коммит с тем же изменением, но своим собственным хэшем.
Что важно учитывать:
- Конфликты: Если код в области изменений отличается, возникнет конфликт слияния, который нужно разрешить вручную, как при обычном
merge. - Не копирует всю историю: Переносится только итоговый diff (разница) конкретного коммита. Это не замена полноценному слиянию веток.
- Использовать с осторожностью: Злоупотребление
cherry-pickможет привести к рассинхронизации истории и дублированию коммитов. Я использую его точечно, для переноса горячих исправлений (hotfix).
Ответ 18+ 🔞
А, слушай, про cherry-pick! Это же, блядь, как взять одну конкретную конфетку из чужой коробки, не таская всю коробку к себе на стол. Ёпта, удобная штука, если понимать, когда её применять.
Представь себе: сидишь ты в ветке develop, нашёл и починил жуткий баг, который всё ломает. Коммит abc123, красота. А потом смотришь — а в production ветке, которая стабильность, этого фикса до сих пор нет, и там всё горит. Ну ёперный театр, делать полное слияние (merge) всей develop — это овердохуища рисков, там же половина нового кода ещё не готова. Вот тут-то наш спаситель и выходит на сцену.
Делается всё просто, как палка:
# 1. Перехожу в ветку, куда нужно перенести исправление
$ git checkout production
# 2. "Выбираю" нужный коммит из develop
$ git cherry-pick abc123
И Git, хитрая жопа, пытается наложить именно те изменения, что были в том коммите, прямо на твою текущую ветку. Если повезёт и код вокруг не менялся — всё пройдёт гладко, и в production родится новый коммит-близнец с тем же самым исправлением, но своим собственным хэшем. Красота!
Но вот на чём можно обжечься, чувак:
- Конфликты — наше всё. Если в
productionфайлы, которые ты трогал вabc123, уже другие — будет тебе конфликт слияния. Придётся разбираться вручную, прямо как при обычномmerge. Волнение ебать, но что поделать. - Историю он не копирует. Переносится только итоговый diff, сама суть изменения. Это не замена нормальному слиянию веток, а точечный укол.
- Использовать с осторожностью. Если начать бездумно тыкать
cherry-pickналево и направо, можно получить такую кашу в истории, что потом сам от себя охуеешь. Дублирование коммитов, рассинхронизация — это пиздец. Я лично применяю его только для вот таких срочных горячих исправлений (hotfix), когда нужно быстро и точечно залатать дыру, не трогая ничего лишнего. Во всех остальных случаях — доверия ебать ноль, лучше нормально смержиться.