git cherry-pick: como levar um commit específico para outra branch
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
| Flag | O que faz | Quando usar |
|---|---|---|
-x | Adiciona à mensagem a linha "(cherry picked from commit …)" | Ao levar correções entre branches públicas — a origem fica visível |
-n, --no-commit | Aplica as alterações no índice e na pasta de trabalho sem commit | Quer juntar vários commits em um ou ajustar algo antes do commit |
-e, --edit | Abre o editor para alterar a mensagem | Precisa adaptar a mensagem à branch de destino |
-s, --signoff | Adiciona a linha Signed-off-by | Projetos que exigem DCO |
-m 1 | Indica o pai "principal" de um commit de merge | Copiar um commit de merge |
--ff | Avança a branch se o HEAD for pai do commit escolhido | Raramente; evita criar um duplicado |
--allow-empty | Permite copiar commits que já eram vazios na origem | Commits 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:
- Resolver e continuar. Abra o arquivo, remova os marcadores
<<<<<<<,=======,>>>>>>>, deixando a versão correta, depoisgit add src/discount.jsegit cherry-pick --continue. - Pular o commit. Ao copiar uma lista,
git cherry-pick --skippula o commit problemático e passa para o próximo. - Cancelar tudo.
git cherry-pick --abortvolta 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-pick | git apply | |
|---|---|---|
| Origem | Um commit que existe no repositório | Um arquivo de patch (diff) |
| Cria commit | Sim (sem -n) | Não, só altera os arquivos (com --index, também o índice) |
| Mantém autor e mensagem | Sim | Não, o patch não tem essas informações |
| Conflitos | Merge de três vias com marcadores | Por padrão simplesmente recusa; com --3way, marcadores |
| Precisa de repositório comum | Sim, o commit precisa estar disponível localmente | Nã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.
Este tema é abordado em profundidade, com prática, no curso “Git do zero ao desenvolvedor confiante”.
Ir para o curso