git rebase
Continuando a série sobre git conceitual, no artigo anterior falei sobre merges, juntando versões diferentes do projeto.
Outra opção para integrar versões diferentes do projeto é o rebase.
rebase
O rebase reescreve, commit a commit, todos os commits do branch de origem desde o ponto em que divergiram (ancestral comum) no branch de destino (upstream).
Cenário antes de executar o rebase:
Após executar o rebase do branch feature/asas
no main
:
Através do Learn Git Branching podemos executar e visualizar de forma animada a operação de rebase:
Note que os commits anteriores continuarão existindo no repositório, só não serão referenciados por nenhum branch e por isso não estarão visíveis no histórico.
Caso seja necessário reverter a operação, é possível reapontar o branch para o commit que estava antes do rebase. (isso não será tratado nesse artigo, mas as referências são: reflog
para localizar o id do commit anterior caso não tenha, reset
para reapontar a branch para o commit)
Como o rebase reescreve o histórico criando novos commits, caso os commits já tenham sido compartilhados com outras pessoas, elas podem ter problemas.
rebase interativo
Também é possível fazer um rebase interativo, onde você cria um script que diz o que fazer com cada commit: usar ele, juntar com o anterior, pausar pra editar manualmente, reescrever a mensagem etc.
conclusão
- o rebase modifica o histórico
- não reescreva histórico que já foi compartilhado em algum repositório remoto, pois pode impactar o trabalho de outras pessoas.