Tutorial

git cherry-pick: como levar um commit específico para outra branch

Atualizado: · Skillaria.Top

O git cherry-pick pega as alterações de um commit e cria na branch atual um novo commit com o mesmo diff e a mesma mensagem, mas com outro hash. Vá para a branch de destino e execute git cherry-pick <hash>; em caso de conflito, corrija os arquivos, rode git add e git cherry-pick --continue.

O git cherry-pick leva as alterações de um commit específico para a branch atual, sem fazer merge da branch inteira. O Git calcula o diff do commit escolhido em relação ao pai dele, aplica esse diff ao seu HEAD e cria um novo commit — com a mesma mensagem e o mesmo autor, mas com outro hash, porque o pai é diferente.

Cenário típico: na branch de uma feature você corrigiu um bug, e a correção é urgente na branch de release, onde a feature ainda não está pronta. Fazer merge da branch inteira não dá, mas de um único commit, sim.

Como levar um commit para outra branch

Primeiro encontre o hash do commit desejado, depois mude para a branch de destino e execute o cherry-pick.

# 1. Encontramos o commit na branch feature
git log --oneline feature
a1b2c3d Corrigir divisão por zero no cálculo do desconto
9f8e7d6 Adicionar nova tela de pagamento

# 2. Vamos para a branch de destino
git switch release-1.4

# 3. Copiamos o commit
git cherry-pick a1b2c3d
[release-1.4 4e5f6a7] Corrigir divisão por zero no cálculo do desconto
 Date: Mon Oct 5 14:12:03 2026 +0300
 1 file changed, 3 insertions(+), 1 deletion(-)

Repare: o novo commit recebeu o hash 4e5f6a7, e não a1b2c3d. São dois objetos diferentes com as mesmas alterações. A branch de origem feature não muda.

Em vez do hash, você pode passar qualquer referência a um commit: git cherry-pick feature pega o último commit da branch feature, git cherry-pick feature~2 o terceiro a partir do fim.

Como copiar vários commits

Listando um por um

Os hashes podem ser passados em lista — o Git aplica na ordem indicada e cria a mesma quantidade de commits novos.

git cherry-pick a1b2c3d 7c8d9e0 3f4a5b6

A ordem importa: se o segundo commit depende do primeiro e você os listou ao contrário, vai ter conflito ou código quebrado. É mais seguro listar do mais antigo para o mais novo.

Por intervalo

Para commits consecutivos, usa-se a sintaxe de intervalo. Aqui há uma armadilha em que quase todo mundo tropeça: A..B significa "commits alcançáveis a partir de B, mas não de A", ou seja, o próprio A não entra no intervalo.

# Copia os commits DEPOIS de A até B, inclusive
git cherry-pick A..B

# Copia A e tudo até B, inclusive
git cherry-pick A^..B

Se você precisa levar tudo o que está na branch feature e não está na main, a forma git cherry-pick main..feature é prática. Mas, se forem muitos commits, pense bem: talvez você precise de rebase ou merge, e não de cherry-pick.

Flags úteis do git cherry-pick

FlagO que fazQuando usar
-xAdiciona à mensagem a linha "(cherry picked from commit …)"Ao levar correções entre branches públicas — a origem fica visível
-n, --no-commitAplica as alterações no índice e na pasta de trabalho sem commitQuer juntar vários commits em um ou ajustar algo antes do commit
-e, --editAbre o editor para alterar a mensagemPrecisa adaptar a mensagem à branch de destino
-s, --signoffAdiciona a linha Signed-off-byProjetos que exigem DCO
-m 1Indica o pai "principal" de um commit de mergeCopiar um commit de merge
--ffAvança a branch se o HEAD for pai do commit escolhidoRaramente; evita criar um duplicado
--allow-emptyPermite copiar commits que já eram vazios na origemCommits vazios de serviço

Para que serve o -x

Daqui a seis meses alguém vai ver a correção na branch de release e querer entender de onde ela veio. A linha adicionada pelo -x responde direto:

git cherry-pick -x a1b2c3d
git log -1
    Corrigir divisão por zero no cálculo do desconto

    (cherry picked from commit a1b2c3d4e5f60718293a4b5c6d7e8f9012345678)

Use -x quando o commit original já foi publicado. Ao copiar de uma branch local sua, que depois será apagada, a referência apontaria para o nada — aí a flag não é necessária.

Juntar vários commits em um: -n

git cherry-pick -n a1b2c3d 7c8d9e0
git status          # alterações dos dois commits no índice
git commit -m "Correções no cálculo do desconto"

Conflitos no cherry-pick e como resolvê-los

O conflito acontece quando as alterações do commit não se encaixam no código atual: na branch de destino as mesmas linhas já estão diferentes. O Git para e avisa.

git cherry-pick a1b2c3d
Auto-merging src/discount.js
CONFLICT (content): Merge conflict in src/discount.js
error: could not apply a1b2c3d... Corrigir divisão por zero no cálculo do desconto
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".

A partir daí, você tem três caminhos:

  1. Resolver e continuar. Abra o arquivo, remova os marcadores <<<<<<<, =======, >>>>>>>, deixando a versão correta, depois git add src/discount.js e git cherry-pick --continue.
  2. Pular o commit. Ao copiar uma lista, git cherry-pick --skip pula o commit problemático e passa para o próximo.
  3. Cancelar tudo. git cherry-pick --abort volta a branch ao estado anterior ao início da operação.

Existe ainda o git cherry-pick --quit: ele encerra a operação, mas mantém os commits já aplicados e o estado atual dos arquivos. Útil quando você copiou metade da lista com sucesso e quer seguir manualmente daí em diante.

Se os conflitos se repetem toda vez (por exemplo, você leva correções regularmente para várias branches de release), ative git config rerere.enabled true — o Git vai lembrar como você resolveu o conflito e aplicar a solução automaticamente da próxima vez.

Como copiar um commit de merge

Um commit de merge tem dois pais, e o Git não sabe em relação a qual calcular o diff. Sem essa indicação, você recebe um erro:

git cherry-pick 5d6e7f8
error: commit 5d6e7f8 is a merge but no -m option was given.

A flag -m 1 diz: calcule as alterações em relação ao primeiro pai — normalmente a branch que recebeu o merge. Assim você leva tudo o que a branch mesclada trouxe em um único commit.

git cherry-pick -m 1 5d6e7f8

Lembre-se de que, depois disso, o Git não vai considerar a branch como mesclada: num merge futuro ele pode tentar aplicar as mesmas alterações de novo.

git cherry-pick vs git apply: qual a diferença

O git apply costuma ser lembrado junto com o cherry-pick, porque os dois "aplicam alterações". Mas eles trabalham com entradas diferentes.

git cherry-pickgit apply
OrigemUm commit que existe no repositórioUm arquivo de patch (diff)
Cria commitSim (sem -n)Não, só altera os arquivos (com --index, também o índice)
Mantém autor e mensagemSimNão, o patch não tem essas informações
ConflitosMerge de três vias com marcadoresPor padrão simplesmente recusa; com --3way, marcadores
Precisa de repositório comumSim, o commit precisa estar disponível localmenteNão, o patch pode ser enviado de qualquer jeito

Exemplo de uso do git apply quando o commit não está no seu repositório — um colega mandou o diff em um arquivo:

# O colega faz
git diff main..fix-discount > fix.patch

# Você verifica e aplica
git apply --check fix.patch   # verificar se o patch se aplica
git apply fix.patch           # aplicar na pasta de trabalho
git apply --3way fix.patch    # se houver divergências, com marcadores de conflito

Se você precisa enviar o commit inteiro, com autor e mensagem, use a dupla git format-patch e git am: o primeiro salva os commits em arquivos, o segundo cria commits a partir deles. Na prática, é um cherry-pick "por e-mail".

Aliás, também é possível fazer cherry-pick de outro repositório: adicione-o como remote, execute git fetch e os commits ficam disponíveis pelo hash.

Quando o cherry-pick é uma má ideia

O cherry-pick cria duplicados: a mesma alteração vive no histórico com dois hashes. Em pequenas doses tudo bem, mas há cenários em que ele atrapalha.

  • Copiar dezenas de commits. Se você está levando quase a branch inteira, isso é rebase ou merge. Aqui o cherry-pick gera um histórico longo de duplicados e mais conflitos.
  • Cópias nos dois sentidos. O commit foi copiado da feature para a main e depois a feature é mesclada na main. O Git normalmente dá conta (as alterações coincidem), mas, se as linhas foram editadas depois da cópia, aparece um conflito do nada.
  • Commits dependentes. O commit usa uma função adicionada dois commits antes. O cherry-pick copia só o próprio commit, e o código na branch de destino não compila. Sempre confira o build e os testes depois da cópia.

Uma boa prática para hotfixes é fazer a correção direto na branch suportada mais antiga e mesclá-la "para cima" nas mais novas. Assim o cherry-pick fica só como exceção.

Como desfazer um cherry-pick

Se a operação ainda está em andamento (conflito) — git cherry-pick --abort. Se o commit já foi criado e não foi enviado ao servidor, remova-o:

git reset --hard HEAD~1

Se o commit já foi enviado para uma branch compartilhada, não se deve reescrever o histórico — crie um commit inverso:

git revert 4e5f6a7

E, se você fez reset e se arrependeu, o commit perdido pode ser encontrado com git reflog.

Como verificar se um commit já foi copiado

Como os hashes são diferentes, o git branch --contains comum não ajuda. O Git sabe comparar commits pelo conteúdo das alterações (patch-id):

git cherry -v release-1.4 feature
- a1b2c3d Corrigir divisão por zero no cálculo do desconto
+ 9f8e7d6 Adicionar nova tela de pagamento

O sinal de menos indica que uma alteração equivalente já existe em release-1.4; o de mais, que ainda não. Uma alternativa é git log --cherry-pick --oneline release-1.4...feature, que esconde os commits gêmeos. Se você usou -x, basta procurar pela mensagem: git log --grep="cherry picked from commit a1b2c3d".

Resumo

O git cherry-pick é uma ferramenta pontual: levar um hotfix para o release, resgatar um commit útil de uma branch abandonada, recuperar um commit feito na branch errada. Lembre-se de três coisas: o novo commit ganha um hash novo, o intervalo A..B não inclui A e, em branches públicas, vale adicionar -x. Se você precisa aplicar não um commit, mas um diff de um arquivo, use o git apply. Rebase, stash, cherry-pick e tags são trabalhados em detalhe na prática no curso de Git.

Perguntas frequentes

O cherry-pick altera a branch de origem?

Não. O commit original continua onde está, e na branch atual aparece uma cópia dele com um hash novo.

Dá para fazer cherry-pick de um commit de uma branch remota?

Sim. Execute git fetch; depois disso o commit fica acessível pelo hash ou como origin/nome-da-branch e pode ser passado para o git cherry-pick.

Por que o commit fica com outro hash depois do cherry-pick?

O hash depende do pai, da data do commit e do conteúdo da árvore. A cópia tem outro pai e outra data de committer, então o hash também muda.

O autor do commit é mantido no cherry-pick?

Sim, o autor e a data de autoria vêm do commit original, e você passa a ser o committer, com a data atual.

O que fazer se o cherry-pick diz que o commit está vazio?

Significa que essas alterações já existem na branch. Pule-o com git cherry-pick --skip ou registre-o vazio com git commit --allow-empty.

Aprenda este tema em vídeo

Este tema é abordado em profundidade, com prática, no curso “Git do zero ao desenvolvedor confiante”.

Ir para o curso