W3docs

git cherry-pick

Aprenda o comando git cherry-pick para copiar commits individuais de um branch para outro. Veja opções, resolução de conflitos e exemplos.

O que o git cherry-pick faz

O comando git cherry-pick pega a alteração introduzida por um ou mais commits existentes e a reaplicar no seu branch atual como um novo commit. Enquanto git merge e git rebase movem linhas inteiras de histórico de uma vez, o cherry-pick permite pegar um único commit e colocá-lo exatamente onde você precisa.

Esta página explica como o cherry-pick funciona internamente, como selecionar um commit ou um intervalo, as opções que você realmente usará, como resolver conflitos e quando usar o cherry-pick em vez de um merge ou git revert.

git cherry-pick copiando um commit de um branch de funcionalidade para o main

Como funciona

Um commit é um snapshot, mas o cherry-pick o trata como um patch: ele calcula a diferença entre o commit e seu pai, aplica essa diferença no topo do seu branch atual e registra um novo commit. O novo commit mantém a mensagem, o autor e a data originais, mas recebe um novo hash e um novo pai porque agora está em um lugar diferente no histórico.

Essa diferença é o modelo mental fundamental: o cherry-pick copia uma alteração, ele não a move. O commit de origem permanece exatamente onde estava no seu branch original.

git switch main
git cherry-pick a1b2c3d

A alteração do commit a1b2c3d agora está no main como um commit novo.

Um exemplo prático

Suponha que uma correção foi aplicada no feature, mas pertence mesmo ao main. Primeiro, encontre o hash do commit com git log:

git switch feature
git log --oneline
# d9ae654 fix login redirect
# 7c1a902 work in progress
# fa42ab5 base

Agora mude para o main e copie apenas esse commit:

git switch main
git cherry-pick d9ae654
[main 02bbf3e] fix login redirect
 1 file changed, 1 insertion(+)

Observe o novo hash 02bbf3e — a correção agora está no main como um commit completamente novo, enquanto d9ae654 ainda existe intocado no feature.

Selecionando um intervalo de commits

Você pode aplicar vários commits de uma vez. Um intervalo copia cada commit depois do primeiro até o último, inclusive:

git cherry-pick a1b2c3d..f4e5d6c

Isso exclui o próprio a1b2c3d. Para tornar o intervalo inclusivo do commit inicial, adicione o sufixo ^ para que o intervalo comece no seu pai:

git cherry-pick a1b2c3d^..f4e5d6c

Os commits são aplicados um de cada vez, em ordem; se algum causar conflito, o cherry-pick pausa naquele commit para que você possa corrigir antes de continuar.

Opções comuns

ComandoDescrição
git cherry-pick <commit>Aplica a alteração de <commit> como um novo commit no branch atual.
git cherry-pick -n <commit>Aplica a alteração, mas não faz o commit, deixando-a staged para que você possa revisar ou modificar antes de confirmar.
git cherry-pick -x <commit>Adiciona uma linha (cherry picked from commit …) à mensagem — útil em branches públicos para que outros possam rastrear a origem.
git cherry-pick -e <commit>Abre seu editor para que você possa alterar a mensagem do commit antes de ser registrado.
git cherry-pick --continueRetoma a operação após você ter resolvido os conflitos.
git cherry-pick --skipIgnora o commit atual (por exemplo, quando sua alteração já está presente) e avança.
git cherry-pick --abortCancela a operação e restaura o branch ao seu estado original.

Com -x, a mensagem registrada fica assim:

fix login redirect

(cherry picked from commit d9ae65426adbde425c3e386a32297e9e833d8816)

Resolução de conflitos

Se a alteração não puder ser aplicada de forma limpa, o cherry-pick pausa de forma semelhante ao que um merge faz e deixa marcadores de conflito nos arquivos afetados. Você verá:

CONFLICT (content): Merge conflict in app.js
error: could not apply d9ae654... fix login redirect
hint: ... fix conflicts and then run "git cherry-pick --continue".

Resolva os arquivos em conflito manualmente, coloque-os em stage com git add e continue:

git add app.js
git cherry-pick --continue

Três opções de saída estão disponíveis neste ponto:

  • git cherry-pick --continue — finaliza após resolver os conflitos.
  • git cherry-pick --skip — descarta o commit atual e avança para o próximo no intervalo.
  • git cherry-pick --abort — cancela tudo e retorna o branch ao estado inicial.

Use git status a qualquer momento para ver quais arquivos ainda estão em conflito.

Quando usar

O cherry-pick é ideal quando:

  • Uma correção foi aplicada no branch errado e você precisa dela em outro lugar.
  • Você está fazendo backport de um único patch para um branch de release ou manutenção.
  • Você quer um commit específico de um branch de funcionalidade sem fazer merge de tudo.

Cherry-pick vs. merge, rebase e revert

ObjetivoUse
Copiar um (ou alguns) commits específicos para outro branchgit cherry-pick
Integrar todo o histórico de um branchgit merge
Mover os commits de um branch para uma nova basegit rebase
Desfazer um commit registrando um commit opostogit revert

Armadilhas

  • Duplicatas no histórico compartilhado. Fazer cherry-pick em um branch que posteriormente será mesclado de volta à origem cria dois commits com a mesma alteração. O Git geralmente é inteligente o suficiente para ignorar a duplicata no momento do merge, mas isso pode complicar o histórico — prefira merge ou rebase quando quiser o branch inteiro.
  • Resultados vazios. Se a alteração já estiver presente no destino, o cherry-pick para com The previous cherry-pick is now empty. Use git cherry-pick --skip para avançar ou --abort para cancelar.
  • Novo hash, não o original. Como o commit é recriado, seu hash muda. Adicione -x para que a mensagem registre a origem.

Prática

Prática
O que o 'git cherry-pick' faz com o commit que copia?
O que o 'git cherry-pick' faz com o commit que copia?
Was this page helpful?