DEV Community

Luiz Eduardo Prado Veltroni
Luiz Eduardo Prado Veltroni

Posted on • Edited on

Cherry pick — Git e Github

As vezes precisamos pegar um commit individual que se encontra em uma outra branch, com alguma feature ou correção que aconteceu em paralelo, o Cherry pick faz exatamente isso, ele junta dois commits em uma linha do tempo, evitando de repente de realizar um Merge.


Cherry pick

Em alguns momentos nos vemos em uma situação onde estamos desenvolvendo em uma branch(chamaremos de Branch X), porém existe outro integrante do time que está trabalhando em uma task em outra branch (chamaremos de Branch Y), as duas estão sendo desenvolvidas juntas. O dev da branch Y encontrou e corrigiu um bug que impacta diretamente na task da branch X.

Cherry pick

Ao invés de ter que realizar um commit e fazer um merge ou qualquer outra gambiarra (Não precisa mandar o código pelo privado) pode ser feito um commit da correção e o dev da branch X usa o Cherry pick para pegar apenas a correção e trazer para a sua linha do tempo.

Lembrando que o cherry pick não é bala de prata, as vezes realmente é melhor fazer um merge.


Cherry pick na prática

Antes de irmos para o Bash, é interessante esclarecer que é necessário ter duas branchs e pelo menos um commit na branch que você vai pegar o commit.

Vamos começar bem do início, precisamos criar uma branch:
git checkout -b feat/header

Realizar um commit:
git commit -am "Feat: create header"

Criar uma nova branch (a que vai receber o commit, no caso da branch feat/header).
git checkout -b feat/menu-hamburger

Output

Imagine agora que o dev que está desenvolvendo na branch feat/header encontrou um problema e já corrigiu, e a pessoa que está na feat/menu-hamburger precisava ter acesso a essa correção.

Agora precisamos pegar o HASH (Identificador) do commit que queremos, para isso vamos na branch que está o commit:
git checkout feat/header

Rodamos um git log para mostrar os commit e seu respectivo HASH:
git log --oneline

Voltamos para a branch que ira receber o commit:
git checkout feat/menu-hamburger

E rodamos o tão famoso Cherry-pick, lembrando de passar o HASH:
git cherry-pick 68bbe92

Output
Resolva os conflitos, se existirem


Pegar um conjunto de commit

Mas e se eu quiser pegar mais de um commit, será que dá? SIM!, o Cherry pick suporta esse tipo de ação.
Segue os mesmo passos do anterior, porém, invés de pegar apenas um HASH você precisa pegar o último e o primeiro (Calma, eu não digitei errado, o último realmente vem na frente) commit que você quer, e ira pegar todos que estiverem dentro dele, a sintaxe é extremamente fácil:

Devemos pegar os dois HASH (o ultimo e o primeiro):
Lembrando que o HASH-A (o ultimo) deve estar após o HASH-B (o primeiro), ou seja ser mais velho na linha do tempo.
git cherry-pick HASH-A HASH-B

Output


Conflitos:

Caso você queira cancelar um Cherry pick, é simples, passe a flag —abort:
git cherry-pick --abort

Para continuar, use a flag —continue:
git cherry-pick --continue

E para pular, —skip:
git cherry-pick --skip


Nesse post vimos como o Cherry pick é extremamente poderoso e importante de conhecer, em algum momento você vai precisar usar, e ele vai salvar a sua vida. É importante identificar quando é melhor utilizar o Cherry pick e quando usar o Merge, mas fique tranquilo por que isso vem com o tempo.

Top comments (1)

Collapse
 
joaovict0r2 profile image
João Victor • Edited

Muito Interessante, não tinha conhecimento do cherry pick, realmente é muito poderoso!