Cherry-Picking Explained

A ajuda online do Git tem uma descrição perfeitamente precisa, mesmo que caracteristicamente sucinta, do que o comando faz:

Dados um ou mais commits existentes, aplica a mudança que cada um introduz, gravando um novo commit para cada um.

Eu já tinha mencionado (lá na página sobre Garbage Collection) que o ID de um commit do Git é um hash do seu conteúdo e do seu histórico. Então, mesmo que você tenha dois commits que introduzem exatamente a mesma mudança, se eles apontam para commits pais diferentes, eles terão IDs diferentes.

O que o git cherry-pick faz, basicamente, é pegar um commit de algum outro lugar, e "reproduzí-lo" onde quer que você esteja agora. Como isso introduz a mesma mudança com um pai diferente, o Git constroi um novo commit com um ID diferente.

Vamos voltar ao exemplo da seção Reachability:

Se você estivesse no vértice H deste grafo, e você digitasse git cherry-pick E (sim, você na verdade digitaria parte ou todo o SHA do commit, mas para simplificar, vamos apenas usar os rótulos que já estão aqui), você acabaria com uma cópia do commit E—vamos chamá-lo de "E linha" ou E'—que apontava para H como seu pai, como:

Ou, se você digitasse algo como git cherry-pick C D E, você acabaria com isso quando estivesse terminado:

O importante a perceber aqui é que o Git copiou as mudanças feitas num lugar, e as reproduziu em algum outro lugar.

Eis uma rápida apresentação dos passos deste processo:

Passo 1
Passo 2
Passo 3
Passo 4
Passo 5
Passo 6
Passo 7