Git: O que é e como usar o Git Cherry Pick?

🇧🇷

Git, é um sistema de controle de versão moderno criado por Linus Torvalds, mesmo criador do Linux Kernel. O Git é uma das ferrementas de código aberto mais utilizadas pelos programadores, sendo responsável por manter registradas quaisquer alterações a um determinado projeto. Com isso, permitindo que seja possível, comparar diferentes versões, avançar ou regredir no histórico de versões deste mesmo projeto, e muitas outras tarefas.

Se você ainda não entende muito bem o que é e como funciona o Git, mas gostaria de aprender, recomendo este artigo. Além disso, tenho alguns outros artigos, que escrevi há algum tempo aqui no blog sobre o assunto:


O que é o Git Cherry Pick, e como mover pequenos pedaços de código entre branches?

O cherry-pick é um dos comandos do git que nos permite levar partes específicas da nossa árvore de commits para uma branch desejada.

Lembrando que o cherry-pick é um comando muito útil, quando bem utilizado. Porém, ele não pode substituir o git merge e o git rebase, por exemplo. Cada um possui uma situação que se encaixa melhor. Use o cherry-pick apenas em último caso, com cuidado para não duplicar commits na sua linha do tempo, de forma desnecessária. Use com moderação!

Então vamos para o exemplo:

O exemplo mais simples que eu posso trazer para representar a ideia do cherry-pick é o de levar alterações que estão em uma branch específica para a branch de produção (main, neste caso), sem afetar outras branches pré-prod.

Grafico 1 - Exemplo prático do comando git cherry-pick.

Grafico 1 - Exemplo prático do comando git cherry-pick.

Para melhor entendimento, digamos que, neste exemplo, temos:

  • 2 features em processo code review e merge nos nosso ambiente de testing/qa, onde uma delas é uma feature com bugs (linha vermelha), e outra sem bugs (linha verde).
  • 1 hotfix, ou ajuste rápido a um bug que temos em staging e que precisa ser corrigido antes de ir pra produção
  • Algumas destas features já integradas em staging, aguardando para serem integradas na main
  • Várias novas features em testing/qa , que irão para staging em breve.
  • A branch main representa nosso ambiente de produção.

Considerando que já temos vários commits em staging e mais alguns em testing/qa, como podemos fazer para:

  1. Enviar o ajuste para staging, e então main, sem precisar enviar tudo que temos de divergente na branch testing/qa, que terá outro bug oriundo da branch feature-1 com bug, bloqueando assim, o fluxo padrão das nossas features?
  2. Seguir o fluxo de integração com nossa branch hotfix-1 (enviando a branch para testing/qa, junto com outras features);

Bom, para resolver o passo 1, podemos usar o commando cherry-pick . Ele vai nos ajudar, seguindo exatamente o que a linha azul do nosso gráfico 1 representa.

Para resolver o passo 2, podemos seguir o fluxo normalmente. Nenhuma alteração é necessária, e com isto vamos manter nossas branches sincronizadas com o contéudo do cherry-pick.

Como executar o comando git cherry-pick?

O cherry-pick, pode ser feito de algumas formas: command line, ou interface gráfica. A marioria dos gerenciadores de repositórios git (Gitlab, Github e Bitbucket, etc) já incluem uma opção de cherry-pick por padrão em cada Pull (ou Merge) Request.

Para realizar esta ação por linha de comando, primeiro você deve ir para a branch que você quer levar para a branch alvo e exibir o identificador do ultimo commit que você deseja integrar.

git checkout hotfix-1
git rev-parse HEAD
//=> 851a2508b93007e145b132dae2c69a7165734a8a

Com o resultado acima, podemos realizar navegar até a nossa branch alvo e realizar o cherry-pick:

git checkout stagig
git cherry-pick 851a2508b93007e145b132dae2c69a7165734a8a

Pronto! Simples assim.

E ai, curtiu? Compartilha com uma pessoa desenvolvedora que vai gostar também. 🙂