Что делает команда git cherry-pick?

Ответ

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), когда нужно быстро и точечно залатать дыру, не трогая ничего лишнего. Во всех остальных случаях — доверия ебать ноль, лучше нормально смержиться.