Git: comandos que salvam sua pele quando o negócio aperta

Rebase, cherry-pick e reflog explicados de forma prática, pra quando o "git add, commit, push" do dia a dia não dá conta do problema. Entenda quando usar cada um e como sair de uma enrascada sem perder trabalho.


A maioria das pessoas usa uma fração pequena do que o Git realmente oferece: add, commit, push, pull, de vez em quando um merge. Isso resolve o dia a dia tranquilo, mas quando o negócio aperta (histórico bagunçado, commit no lugar errado, branch que precisa de um ajuste específico de outra) esse conjunto básico não dá conta. Vou passar por três comandos que resolvem justamente essas situações.

Rebase: reescrevendo a base de uma branch

merge e rebase resolvem o mesmo problema (trazer mudanças de uma branch pra outra), mas de jeitos diferentes. merge cria um commit novo juntando os dois históricos, preservando tudo como aconteceu. rebase pega os commits da sua branch e reaplica eles em cima do commit mais recente da branch de destino, como se você tivesse começado a trabalhar a partir dali.

git checkout minha-feature
git rebase main

O resultado é um histórico linear, sem aquele commit de merge no meio. Isso deixa o histórico mais fácil de ler, mas tem uma regra que não se negocia: nunca dar rebase numa branch que outras pessoas já estão usando. Rebase reescreve o histórico, muda o hash de cada commit reaplicado, e se alguém mais tem essa branch localmente, o próximo pull dessa pessoa vira uma bagunça de conflito.

Uma variação bem útil é o rebase interativo, pra organizar commits antes de abrir um PR:

git rebase -i HEAD~3

Isso abre uma lista com os últimos três commits, e você escolhe o que fazer com cada um: manter, juntar com o anterior (squash), reescrever a mensagem (reword) ou até descartar. É a ferramenta certa pra transformar aquele histórico de "fix", "fix de novo", "agora vai" em um commit único e limpo antes de mandar pra revisão.

Cherry-pick: trazendo um commit específico

Às vezes você não quer a branch inteira, só um commit específico dela. Talvez alguém tenha corrigido um bug numa branch que ainda não foi mergeada, e você precisa dessa correção agora, sem trazer o resto do trabalho em andamento junto.

git cherry-pick a1b2c3d

Isso pega o commit a1b2c3d, de qualquer branch, e aplica ele na branch atual, como um commit novo. É bastante usado pra levar um hotfix de uma branch pra outra sem precisar de merge completo, por exemplo aplicar uma correção de produção também na branch de desenvolvimento.

Vale lembrar que cherry-pick cria um commit novo, com hash diferente do original. Se depois você mergear as duas branches, o Git geralmente identifica que o conteúdo já foi aplicado e não duplica nada, mas em históricos mais complexos isso pode gerar conflito, então não é uma ferramenta pra abusar como substituto de merge.

Reflog: o cinto de segurança

Esse é o comando que salva quando parece que perdeu tudo. git reflog mostra um histórico de tudo que aconteceu com o HEAD do seu repositório, incluindo coisas que não aparecem no git log normal: commits que ficaram órfãos depois de um reset, branches deletadas, rebases desfeitos.

git reflog
a1b2c3d HEAD@{0}: commit: ajusta validação do formulário
f4e5d6c HEAD@{1}: reset: moving to HEAD~1
b7c8d9e HEAD@{2}: commit: primeira tentativa da feature

Se você deu um git reset --hard errado e sumiu com um commit que precisava, o reflog ainda guarda a referência dele por um tempo (por padrão, 90 dias). Basta pegar o hash que aparece ali e criar uma branch nova a partir dele:

git branch recuperado a1b2c3d

Isso recupera o trabalho como se nada tivesse acontecido. reflog é local, guardado só no seu repositório, não sincroniza com o remoto, mas justamente por isso costuma ser a última linha de defesa quando alguém entra em pânico depois de um comando destrutivo.

Não precisa decorar, precisa saber que existe

Ninguém memoriza a sintaxe exata desses comandos de cabeça o tempo todo, isso é normal e nem é o ponto. O que faz diferença é saber que essas ferramentas existem e pra qual situação cada uma serve, porque o momento em que você precisa delas geralmente é o momento de mais estresse: histórico bagunçado antes de um PR importante, correção urgente que precisa ir pra outra branch, ou aquele susto de achar que perdeu trabalho.

Rebase organiza histórico antes de compartilhar. Cherry-pick move um commit específico sem levar o resto junto. Reflog é o que te tira do desespero quando algo parece ter sumido. Guardar esses três na cabeça, mesmo sem saber a sintaxe de memória, já é o suficiente pra não travar na próxima vez que o git add, commit, push do dia a dia não for suficiente.