A maioria da gente aprende Git em quatro comandos: add, commit, push, pull. Dá para trabalhar anos assim. Até o dia em que algo dá muito errado — você apaga um branch por engano, um bug aparece e ninguém sabe de onde veio, um commit foi parar no lugar errado — e os quatro comandos de sempre não bastam.
O Git tem um conjunto de ferramentas para exatamente esses momentos. Ninguém ensina no começo porque parecem avançadas demais. Na real, elas são o kit de primeiros socorros que te tira do sufoco. Vamos aos que mais salvam o dia.
git reflog: a rede de segurança que quase ninguém conhece
Se existe um comando para decorar, é esse. O reflog é um diário de tudo por onde o seu HEAD passou — cada commit, cada troca de branch, cada reset. Mesmo aquele commit que você “perdeu” num reset agressivo continua lá, esperando você voltar.
git reflog
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# e4f5g6h HEAD@{1}: commit: aquilo que eu achei que perdi
# ...
git reset --hard e4f5g6h # de volta ao ponto perdido
Aquela sensação de pânico de “apaguei três horas de trabalho” quase sempre é falsa. O Git raramente joga coisa fora de imediato; ele só deixa de apontar para ela. O reflog te mostra o caminho de volta.
git bisect: caçar o bug por eliminação
“Funcionava semana passada, agora está quebrado, e foram 200 commits no meio.” Testar um por um é tortura. O bisect faz uma busca binária no seu histórico: você marca um commit bom e um ruim, e o Git vai te levando ao ponto exato onde o bug entrou, cortando o intervalo pela metade a cada passo.
git bisect start
git bisect bad # o commit atual está quebrado
git bisect good v1.4.0 # aqui ainda funcionava
# o Git te posiciona no meio; você testa e responde:
git bisect good (ou) git bisect bad
# repita até ele apontar o commit culpado
git bisect reset # volta ao normal
Duzentos commits viram sete ou oito testes. É a diferença entre uma tarde perdida e dez minutos.
git stash: guardar o inacabado sem fazer commit
Você está no meio de uma alteração e chega um “preciso de um hotfix agora”. Fazer commit de código pela metade é feio; perder o que você fez é pior. O stash guarda suas mudanças num canto, limpa a área de trabalho e devolve tudo quando você voltar.
git stash push -m "meio da feature X"
# resolve o hotfix com calma...
git stash pop # traz de volta o que estava guardado
git cherry-pick: levar um commit específico para outro branch
Às vezes você quer só um commit — aquele fix pontual — sem trazer o branch inteiro junto. O cherry-pick pega um commit pelo hash e aplica onde você estiver.
git checkout main
git cherry-pick a1b2c3d # traz só aquele commit
É a ferramenta certa para levar uma correção urgente do branch de desenvolvimento direto para produção sem carregar o resto do que ainda não está pronto.
git revert: desfazer sem apagar a história
Tem uma diferença importante entre reset e revert. O reset reescreve o histórico — ótimo no seu branch local, péssimo em algo que já foi compartilhado. Quando você precisa desfazer um commit que já está no branch principal, o revert é o caminho educado: ele cria um novo commit que anula as mudanças, preservando o histórico intacto.
git revert a1b2c3d # cria um commit que desfaz aquele
Ninguém precisa “recuperar” nada, ninguém fica com o branch bagunçado embaixo dos pés. É o jeito seguro de dizer “isso aqui foi um erro” sem apagar o registro de que aconteceu.
git log -S: achar quando uma linha nasceu ou morreu
O chamado “pickaxe” é subestimado. Precisa descobrir em que commit aquela string de configuração apareceu — ou sumiu? O git log -S vasculha o histórico atrás de mudanças que adicionaram ou removeram um trecho específico:
git log -S "API_TIMEOUT" --oneline
Em vez de rolar centenas de commits no escuro, você vai direto ao ponto onde aquela linha entrou (ou saiu) da sua vida. Ótimo para arqueologia de bug.
Um bônus: git commit –amend
Esqueceu um arquivo no último commit, ou errou a mensagem? Em vez de criar um segundo commit de “ajuste”, o --amend corrige o commit anterior. Só uma regra de convivência: não use em commits que já foram para um branch compartilhado, porque ele reescreve o histórico.
Saber Git de verdade não é decorar comandos. É saber que a rede de segurança existe — para não entrar em pânico quando o chão parece sumir.
Você não precisa dominar tudo isso de uma vez. Mas basta guardar que, quando o desespero bater — o commit sumiu, o bug não tem origem, o trabalho está no lugar errado —, o Git provavelmente já tem um comando esperando por você. Da próxima vez que o chão faltar, respire e lembre: o reflog viu tudo.



