Saltar para o conteúdo

Cherry-pick

Fonte: Wikiversidade

Cherry-picking é um comando do git que permite ao usuário escolher os commits que deseja mandar à uma branch. Assim, ele pode analisar os commits em outra branch do repositório e escolher aquelas que são úteis para ir para sua branch.

É um comando útil, pois permite a adição de apenas commits importantes, evitando commits que estão sem testes ou que contém erros. Além disso, esse comando auxilia no desenvolvimento de softwares colaborativos, visto que vários usuários mandam alterações no código a todo momento. Usando o cherry-picking, é possível escolher os commits relevantes e de qualidades dos colaboradores, para depois levá-los às branchs principais, como a master.

Como Funciona?

[editar | editar código-fonte]

Cada commit salvo pelo git possui um ID que identifica seu o conteúdo e histórico. Ao utilizar o comando git cherry-pick "id do commit", você irá pegar o conteúdo desse commit e irá fixá-lo no lugar que você está em sua branch atual. O git, então, salva esse commit resgatado pelo comando cherry-pick como um commit com um ID diferente.

Por que usar o cherry-picking?

[editar | editar código-fonte]

Já precisou resgatar um commit apenas de uma branch diferente da que você esta usando no momento?

Por vezes, temos a necessidade de resgatar uma pequena parte de código enviado para uma branch, mas isso sem receber outras modificações de código realizadas em outros commits na branch. Com isso, a solução é usar o comando Cherry-picking. Ele resgata um único commit em uma branch diferente da atual sem trazer todas a modificações agregadas após esse commit.

Por que não podemos usar o rebase ou mesmo receber todos os commits e dar um merge?

A ideia é reduzir trabalhos desnecessários, se você sabe que ao realizar o rebase conflitos acontecerão, e esse código que dará conflito não afetara o trabalho que realizará o melhor caminho para poupar rebases e merges é receber apenas o commit que tem efeito em seu trabalho.

Para usar o comando cherry-picking, siga os passos abaixo:

  • Inicialmente vá até a branch que deseja pegar o commit!
git checkout "nome da branch"
  • Procure o commit que deseja receber
git log
  • Pegue o hash do commit e copie. Você visualizara algo parecido com o código abaixo!
"9ce8fa5a3d3a3555222eabb234df93cc5447####"
  • Vá até a branch que deseja receber o commit. Digite o nome sem aspas.
git checkout "nome da branch"
  • Se estiver na branch correta, digite o cherry pick com o hash sem aspas, para receber o commit.
 git cherry-pick "9ce8fa5a3d3a3555222eabb234df93cc5447####" 
  • Se ainda assim tiver algum conflito ao receber o commit, você deve resolver o conflito.
  • Você pode digitar os seguintes comandos para continuar o processo.
git add . 
git commit
  • E salve as mudanças!

Caso dê algum conflito usando o cherry-pick, após resolvê-los use o comando abaixo para continuar o processo:

git cherry-pick --continue 

Caso seja necessário limpar o estado de sequencia após uma falha no cherry-pick, use o comando:

git cherry-pick --quit

E caso deseje cancelar o cherry-pick, use o comando:

git cherry-pick --abort

Cherry-picking para um intervalo de commits

[editar | editar código-fonte]

Mesmo não sendo considerado prático, é possível usar o cherry-picking para obter um intervalo de commits.

Comando cherry-picking para um intervalo de commits:

git cherry-pick A^..B

Sendo A e B os hashs dos commits e necessariamente A deve ser mais antigo do que B.

Obs.: O sinal "^" deve ser usado para considerar o commit A.

https://git-scm.com/docs/git-cherry-pick

https://www.ibm.com/developerworks/community/blogs/fd26864d-cb41-49cf-b719-d89c6b072893/entry/dica_git_da_semana_cherry_picking?lang=en

http://stackoverflow.com/questions/1994463/how-to-cherry-pick-a-range-of-commits-and-merge-into-another-branch

http://think-like-a-git.net/sections/rebase-from-the-ground-up/cherry-picking-explained.html