Rebase Interativo
O rebase interativo é uma das funcionalidades mais poderosas e complexas do Git. Ele permite que você reescreva seu histórico de commits de formas muito flexíveis. Você pode reordenar commits, combinar (squash) commits, editar mensagens ou até remover commits inteiros. É como ter um editor de texto para o seu histórico.
Aviso: O rebase interativo reescreve o histórico. Nunca faça rebase de commits que já foram enviados para um repositório compartilhado, a menos que você entenda perfeitamente as implicações e tenha coordenado com sua equipe.
Vamos criar uma série de commits para ver o rebase interativo em ação:
echo "First change" >> hello.txt
git commit -am "First change"
echo "Second change" >> hello.txt
git commit -am "Second change"
echo "Third change" >> hello.txt
git commit -am "Third change"
A flag -am no git commit é um atalho que prepara todos os arquivos modificados e faz o commit em um único passo.
Agora, vamos limpar esses três commits. Talvez a "First change" e a "Second change" devessem ser um único commit, e queremos melhorar a mensagem da "Third change".
Inicie a sessão de rebase interativo:
git rebase -i HEAD~3
HEAD~3: Seleciona os últimos três commits a partir do atual.
O Git abrirá seu editor de texto com uma lista dos commits. Você verá algo assim:
pick 63c95db First change
pick 68e7909 Second change
pick 5371424 Third change
## Commands:
## p, pick <commit> = use commit
## r, reword <commit> = use commit, but edit the commit message
## s, squash <commit> = use commit, but meld into previous commit
## ...
Nosso Plano de Rebase:
- Agrupar (squash) "Second change" em "First change".
- Renomear (reword) "Third change" para uma mensagem melhor.
Modifique o arquivo no editor para ficar assim:
pick abc1234 First change
squash def5678 Second change
reword ghi9101 Third change
Não altere os hashes dos commits no arquivo.
Instruções para o Vim (se for seu editor):
- Pressione
i para entrar no modo de inserção.
- Altere as palavras "pick" para "squash" e "reword".
- Pressione
Esc.
- Digite
:wq e pressione Enter.
O que acontece em seguida:
- Squashing: O Git combinará as alterações. Ele abrirá o editor novamente para você criar uma mensagem única para os commits combinados. Você pode escrever algo como:
Combined first and second changes: Initial setup of hello.txt.
- Rewording: O Git abrirá o editor mais uma vez para você alterar a mensagem do terceiro commit. Mude para:
Improved third change: Added a more descriptive line to hello.txt.
Verificando o Histórico:
git log --oneline
Você notará que agora tem menos commits, com mensagens mais limpas e descritivas. Os hashes mudaram porque você criou uma nova versão da história.
Lembrete: Se algo der errado durante o rebase, você pode cancelar tudo e voltar ao estado original com o comando:
git rebase --abort