Cherry pick — Git e Github
Tags: git, github, programming, braziliandevs
Published: 2022-03-09 04:05:00

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/raysns0x8pxomd1i6f59.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ayuf8eszjw5gwohr2lq.png)  

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4dleowj2e6zk6usmsr8n.png)
*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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbwkyw91shqqrz5qfv6e.png)

---

### 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.