Merge, rebase, revert: reescrever ou preservar história
Objetivos desta aula
- Resolver conflitos com segurança
- Aplicar rebase apenas onde é seguro
- Reverter mudanças publicadas
Merge preserva a história como aconteceu e cria um commit de junção; rebase reaplica seus commits sobre a base atual, produzindo linha reta. A regra prática é simples: rebase na sua branch local antes do PR, merge para integrar na main. Rebase em branch compartilhada reescreve commits que outras pessoas já têm e gera confusão real.
Conflito não é erro: é o Git avisando que duas mudanças tocaram o mesmo trecho e ele não pode decidir. Você abre o arquivo, escolhe o resultado correto (que às vezes não é nenhum dos dois lados), marca como resolvido e continua. Testar depois de resolver é obrigatório: conflito mal resolvido compila e mesmo assim quebra a lógica.
Para desfazer algo já publicado, use revert: ele cria um novo commit invertendo a mudança e mantém o histórico auditável. reset --hard em branch compartilhada é o caminho mais rápido para perder trabalho de colegas.
1. Merge preserva, rebase reescreve
Merge cria um commit que une duas histórias; nada é alterado. Rebase reaplica seus commits sobre outra base, gerando commits novos com hashes novos. Regra prática: rebase em branches só suas; nunca reescreva história compartilhada.
2. Resolvendo conflitos com calma
O Git marca o trecho com <<<<<<<, ======= e >>>>>>>. Entenda as duas intenções, edite, rode os testes, git add e continue (git rebase --continue ou commit do merge). Em dúvida, --abort volta ao estado anterior.
3. Revert em produção
git revert <sha> cria um commit que desfaz outro, mantendo a história auditável. É o jeito seguro de desfazer algo que já está na main e já foi para produção.
4. Reflog: a rede de segurança
Fez reset --hard errado? git reflog mostra por onde o HEAD passou nos últimos dias; basta criar uma branch naquele ponto para recuperar.
5. Force push com responsabilidade
Se precisar, use git push --force-with-lease: ele recusa o push se alguém enviou algo que você não viu.
6. Checagem final
Você deve saber escolher entre merge, rebase e revert conforme o contexto e recuperar trabalho perdido com reflog.
Na prática
Rebase, conflito e revert
bash
git fetch origin
git rebase origin/main
# em caso de conflito:
git status # ver arquivos em conflito
# edite os arquivos, remova os marcadores <<<<<<< ======= >>>>>>>
git add src/api/orders.js
git rebase --continue
git rebase --abort # desistir e voltar ao estado anterior
git revert 9f3a21c # desfaz commit publicado com seguranca
git revert -m 1 <merge_commit> # desfaz um merge
git reflog | head -20 # rede de seguranca: recuperar estados
git diff origin/main...HEAD # o que a minha branch mudaNota de segurança: Nunca use push --force em branch compartilhada; se necessário, use --force-with-lease.
Atualizar branch e recuperar erro
bash
git fetch origin
git rebase origin/main # reaplica seus commits sobre a main atual
# conflito? edite, depois:
git add . && git rebase --continue
git push --force-with-lease # seguro: recusa se o remoto mudou
git reflog | head -5 # historico do HEAD
git switch -c resgate HEAD@{2} # recupera um estado anteriorPor que isso importa
Rollback rápido depende de histórico confiável. Revert é o botão de emergência do deploy.
Erro comum
Fazer rebase de uma branch que já está em PR aberto e forçar push, invalidando as revisões.
Dica de produção
Se um deploy quebrou produção, reverta primeiro e investigue depois. Restaurar serviço vem antes de entender.
Pergunta de entrevista
Explique quando revert é preferível a reset e por quê.
Glossário
- reflog
- Registro local de todas as posições de HEAD, permitindo recuperar commits 'perdidos'.
- force-with-lease
- Push forçado que falha se o remoto tiver commits que você não viu.
- reflog
- Registro local de todas as posições por onde o HEAD passou.
- force-with-lease
- Push forçado que falha se o remoto tiver commits que você não conhece.
- fast-forward
- Merge que apenas avança o ponteiro, sem commit de merge.
Conexão com o CloudShop
Reverter uma mudança de configuração que quebrou o build do CloudShop.
Quiz da aula
1. Qual comando desfaz um commit já publicado sem reescrever a história?
2. Um commit ruim já está na main em produção. O que usar?
3. Onde recuperar um commit 'perdido' após reset?
Minhas anotações
Salvo automaticamente neste navegador.