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.
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 a1b2c3dA 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 baseAgora 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..f4e5d6cIsso 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^..f4e5d6cOs 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
| Comando | Descriçã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 --continue | Retoma a operação após você ter resolvido os conflitos. |
git cherry-pick --skip | Ignora o commit atual (por exemplo, quando sua alteração já está presente) e avança. |
git cherry-pick --abort | Cancela 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 --continueTrê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
| Objetivo | Use |
|---|---|
| Copiar um (ou alguns) commits específicos para outro branch | git cherry-pick |
| Integrar todo o histórico de um branch | git merge |
| Mover os commits de um branch para uma nova base | git rebase |
| Desfazer um commit registrando um commit oposto | git 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. Usegit cherry-pick --skippara avançar ou--abortpara cancelar. - Novo hash, não o original. Como o commit é recriado, seu hash muda. Adicione
-xpara que a mensagem registre a origem.