# git rebase

# git rebase

Continuando a série sobre [git conceitual](https://lluccia.hashnode.dev/series/git-conceitual), no [artigo anterior](https://lluccia.hashnode.dev/git-merges) 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:
![git-rebase-before.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1662925872843/LvZ5xdt7u.png align="left")

Após executar o rebase do branch `feature/asas` no `main`:
![git-rebase-after.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1662925888787/0RD49gOdM.png align="left")

Através do [Learn Git Branching](https://learngitbranching.js.org/) podemos executar e visualizar de forma animada a operação de rebase:

<img alt="git-rebase.gif" class="image--center mx-auto" src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662925950146/Fgdqwy6ao.gif">

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.

## referências

- <https://git-scm.com/docs/git-rebase>

