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:
- [PT] Como listar os autores do seu projeto pela linha de comando
- [EN] Lembrete: se necessário, utilize --force-with-lease
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.
Para melhor entendimento, neste exemplo temos 2 features e 1 hotfix no nosso ambiente de testing/qa
, onde:
- uma das features contém um bug (linha vermelha), e outra está aprovada (linha verde).
- o hotfix corrige um bug em
staging
antes de tudo ir pramain
(produção).
Considerando que já temos vários commits em staging
e mais alguns em testing/qa
, como podemos fazer para enviar o ajuste para staging
, e então realizar o merge staging
-> main
, sem enviar tudo que temos de divergente na branch testing/qa
?
Além disso, manter o fluxo de integração, com nossa branch hotfix-1
sendo enviada para testing/qa
normalmente e sem conflitos?
Bom, para resolver esse problema, 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 tanto por command line quanto por interface gráfica.
Interface Gráfica
A maioria dos gerenciadores de repositórios git (Gitlab, Github, etc) já incluem uma opção de cherry-pick por padrão em cada Pull (ou Merge) Request.
Cherry-pick localmente por linha de comando
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
//=> Ex.: 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.