O comando git rebase pode ser usado para fazer vários ajustes de histórico, desde reescrever a árvore de commits, reescrevendo assim o histórico, até mesmo empurrar commits para um ponto mais a frente como se o branch fosse criado no futuro.

Nessa colinha vou te mostrar como usar git rebase pra corrigir a origem de um determinado branch.

Criando uma branch a partir de um branch incorreto

Suponha que você tem duas tarefas para fazer nas próximas semanas e que você quer trabalhar em cada tarefa em uma branch diferente.

Então para trabalhar na tarefa 1 você cria uma branch com esse nome a partir do main.

imagem mostrando o resultado de criar o ramo tarefa-1

Digamos, que durante a sua implementação você cansou de mexer com aquele problema e decidiu que seria uma boa ideia mudar um pouco de contexto e iniciar a tarefa 2.

Para isso você precisa criar um novo branch também a partir do main, no entanto, sem se dar conta você acabou criando o seu branch a partir do branch tarefa-1:

imagem mostrando o resultado de criar o ramo tarefa-2 a partir do ramo tarefa-1

E aí, começou a trabalhar e só se deu conta do erro mais tarde. Depois de fazer um commit no tarefa-2 o seu histórico parece algo assim:

desenho mostrando o ramo tarefa-2 com dependente do ramo tarefa-1

Se você analisar o grafo do seu histórico pode ver que ele mostra que o commit mais recente (99247c) no branch tarefa-2 depende do commit feito no branch tarefa-1 (5873c2):

imagem mostrando o resultado do comando git log --graph em tarefa-2 mostrando o histórico dependente do ramo tarefa-1

Então precisamos corrigir isso.

Corrigindo a origem do branch

Com esse erro nas mãos e como as implementações de cada tarefa é independente uma da outra você quer fazer essa correção.

Para isso você deve usar o git rebase seguido da flag --onto e o nome dos três branches, o comando por completo fica assim:

git rebase --onto main tarefa-1 tarefa-2

O resultado deverá ser semelhante a imagem abaixo:

resultado do comando git rebase --onto main tarefa-1 tarefa-2

Agora, tendo executado o comando acima, o seu histórico passa a ser o que deveria ser desde o princípio:

desenho mostrando o ramo tarefa-2 com dependente do ramo main

E se você conferir novamente o grafo do histórico, verá que apenas vemos os commits referentes a tarefa 2 no branch correspondente:

imagem com o resultado do comando git log --graph mostrando o ramo tarefa-2 com histórico corrigido

Três coisas são importantes de notar:

  1. Primeiro, que é sempre necessário dar os nomes dos três branches envolvidos para evitar perder commits;
  2. Segundo, que o agora o branch tarefa-2 tem sua origem no branch main;
  3. E terceiro, que o hash do commit no branch tarefa-2 não é mais 99247c e sim 952dc3 já que o commit mudou.

Com isso agora você sabe alterar ou corrigir a origem de um branch, caso queira mais detalhes sobre o comando git rebase, recomendo a leitura da documentação do comando em português.

Abaixo você pode ver uma ficha que pode te ajudar a lembrar do comando git rebase --onto: