Rebase e Squash
Aula 10 de 12
O que é Rebase?
Rebase reaplica os commits de um branch sobre outro, criando um histórico linear:
Antes do rebase:
main: A---B---C
\
feature: D---E
git switch feature && git rebase main
Depois:
main: A---B---C
\
feature: D'---E'
Rebase vs Merge
| Aspecto | Merge | Rebase |
|---|---|---|
| Histórico | Preserva a árvore real | Cria histórico linear |
| Commits | Commit de merge | Commits reescritos |
| Legibilidade | Mostra "verdade" da colaboração | Mais fácil de seguir |
| Segurança | Não reescreve histórico | Reescreve (cuidado!) |
Rebase Interativo (git rebase -i)
Permite editar, reordenar, combinar e deletar commits:
git rebase -i HEAD~5
Abre um editor com instruções:
pick a1b2c3 feat: adiciona login
pick d4e5f6 fix: corrige validação
pick g7h8i9 chore: ajusta formatação
pick j0k1l2 feat: adiciona logout
pick m3n4o5 fix: remove debug
# Commands:
# p, pick = usar como está
# r, reword = mudar mensagem
# s, squash = combinar com anterior
# f, fixup = combinar, descartando mensagem
# d, drop = remover commit
# e, edit = parar para editar
Squash — Combinando Commits
Útil para limpar commits bagunçados antes do merge:
# Combinar últimos 3 commits em 1
git rebase -i HEAD~3
# Mudar de:
# pick a1b2c3 "wip"
# pick d4e5f6 "corrige typo"
# pick g7h8i9 "finaliza feature"
# Para:
# pick a1b2c3 "feat: implementa feature completa"
# squash d4e5f6
# squash g7h8i9
Regra de Ouro do Rebase
Nunca faça rebase de commits que já foram enviados para o repositório compartilhado.
# OK: rebase em commits locais
git rebase -i HEAD~3
# PERIGO: rebase em commits já no remoto
# (só faça se for o único desenvolvedor no branch)
Recuperando de Rebase Problemático
# Desfazer rebase (antes de dar push)
git rebase --abort
# Se já fez rebase e quer voltar
git reflog
git reset --hard HEAD@{2} # voltar para antes do rebase
cherry-pick — Aplicando Commits Específicos
Útil para pegar commits isolados:
# Aplicar um commit específico no branch atual
git cherry-pick a1b2c3
# Pegar múltiplos commits
git cherry-pick a1b2c3..d4e5f6
# Com opção de não commitar automaticamente
git cherry-pick -n a1b2c3
Rebase é uma ferramenta poderosa para manter histórico limpo. Use com responsabilidade: rebase no local, merge no compartilhado.