Introdução
Básico
Branches
Merge/Rebase
Avançado
GitHub
CI/CD
Esta barra mostra seu progresso no tutorial e permite navegar entre seções principais

Git Cherry-pick: Selecionando Commits Específicos

Objetivo: Aprender a usar o Git Cherry-pick para selecionar commits específicos de uma branch e aplicá-los em outra, entendendo quando essa abordagem é útil e suas limitações.

O que é Git Cherry-pick?

O comando git cherry-pick permite escolher um commit específico de uma branch e aplicá-lo em outra. É como "colher" apenas os commits desejados, sem precisar mesclar toda a branch.

⚠️ ATENÇÃO: Cherry-pick cria cópias dos commits originais, com novos hashes. Isso pode complicar a história do projeto se usado excessivamente.

Quando usar Cherry-pick

Cherry-pick Básico

# Primeiro, identifique o hash do commit desejado
git log --oneline branch-origem

# Mude para a branch de destino
git checkout branch-destino

# Aplique o commit específico
git cherry-pick abc1234

# Para vários commits não consecutivos
git cherry-pick abc1234 def5678 ghi9012

Opções do Cherry-pick

Cherry-pick sem Commit Automático

Para aplicar as mudanças do commit sem criar automaticamente um novo commit:

git cherry-pick --no-commit abc1234
# ou
git cherry-pick -n abc1234

Isso coloca as alterações no seu staging area, permitindo que você faça modificações antes de commitar.

Cherry-pick de Intervalos de Commits

# Para aplicar uma sequência de commits (do mais antigo ao mais recente)
git cherry-pick abc1234^..def5678

Isso aplicará todos os commits desde abc1234 (inclusive) até def5678.

Lidando com Conflitos

# Se ocorrer um conflito durante cherry-pick
# 1. Resolva os conflitos nos arquivos (marcados com <<<<<<< e >>>>>>>)
# 2. Adicione os arquivos resolvidos
git add arquivo-com-conflito

# 3. Continue o cherry-pick
git cherry-pick --continue

# Ou para abortar o cherry-pick
git cherry-pick --abort

Exemplos Práticos

Backporting de correções de bugs

Cenário: Você corrigiu um bug na branch develop e precisa aplicar essa correção também na branch release-1.0 que está em produção.

# 1. Identifique o hash do commit de correção
git log --grep="fix: corrige bug" --oneline develop
# Isso retorna algo como: abc1234 fix: corrige bug de validação

# 2. Mude para a branch de lançamento
git checkout release-1.0

# 3. Aplique o commit de correção
git cherry-pick abc1234

# 4. Envie as alterações para o repositório remoto
git push origin release-1.0

Selecionando recursos específicos

Cenário: Uma branch de feature tem vários commits, mas você só quer aplicar algumas partes específicas na branch principal.

# 1. Veja os commits na branch de recursos
git log --oneline feature/novo-recurso
# abc1234 feat: adiciona validação de formulário
# def5678 feat: implementa upload de arquivos
# ghi9012 feat: adiciona sistema de notificações

# 2. Volte para a branch principal
git checkout main

# 3. Cherry-pick apenas o commit de validação e notificações
git cherry-pick abc1234 ghi9012

Melhores Práticas

  1. Use com moderação: Cherry-pick pode tornar o histórico confuso se usado em excesso
  2. Documente os cherry-picks: Mencione na mensagem de commit que é um cherry-pick e de onde veio
  3. Prefira merge/rebase: Para transferir muitos commits, merge ou rebase geralmente são melhores opções
  4. Commits atômicos: Cherry-pick funciona melhor com commits bem definidos e autocontidos

Exercícios Práticos

Exercício: Cherry-pick seletivo

Objetivo: Praticar a seleção de commits específicos entre branches

  1. Crie uma branch chamada feature/recursos-diversos
  2. Adicione 3 commits distintos (cada um modificando arquivos diferentes)
  3. Volte para a branch principal
  4. Use cherry-pick para aplicar apenas um dos commits

Referências

← Voltar para página principal

ntal em dispositivos móveis --> }); } document.head.appendChild(fallbackStyles); `; } color: white; background: var(--primary-color, #2b3a55); .timeline-item.active { } cursor: pointer; z-index: 2; border: 2px solid var(--primary-color, #2b3a55); border-radius: 20px; }); }); if (!activeFound && timelineItems.length > 0) { timelineItems[0].classList.add('active'); console.log('Nenhum item ativo encontrado. Primeiro item ativado.'); } });