kb.erickguedes.com
Git Completo: do Básico à Certificação

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

AspectoMergeRebase
HistóricoPreserva a árvore realCria histórico linear
CommitsCommit de mergeCommits reescritos
LegibilidadeMostra "verdade" da colaboraçãoMais fácil de seguir
SegurançaNão reescreve históricoReescreve (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.