0 XP
Módulo 3 · Git, GitHub e Bash

Merge, rebase, revert: reescrever ou preservar história

Intermediário 45 min+25 XPGit

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 muda

Nota 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 anterior

Por 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. 1. Qual comando desfaz um commit já publicado sem reescrever a história?

  2. 2. Um commit ruim já está na main em produção. O que usar?

  3. 3. Onde recuperar um commit 'perdido' após reset?

Minhas anotações

Salvo automaticamente neste navegador.

AnteriorPróxima