Veja rebase e merge lado a lado em um grafo de commits ao vivo, planeje um rebase interativo com pick, squash, fixup e drop e aprenda a abortar ou desfazer com o reflog.
git rebase reaplica os commits do seu branch em cima de outro commit, gerando um histórico linear em vez de um merge commit. Rode git rebase main a partir do seu branch de feature, resolva os conflitos e depois rode git rebase --continue. Use git rebase -i para juntar, reescrever ou descartar commits, e git rebase --abort para voltar atrás.
Os comandos de rebase que você mais vai digitar
Rebase é o comando do git que mais assusta, principalmente porque ele reescreve commits. O grafo abaixo mostra exatamente o que muda quando você faz merge ou rebase, o planejador deixa você testar um rebase interativo em commits de exemplo, e as últimas seções tratam de conflitos, da única regra que protege seus colegas e de como recuperar um branch depois de um rebase que deu errado.
O merge mantém o histórico real e adiciona um merge commit, o que é mais seguro para branches compartilhados. O rebase gera uma linha reta, mais fácil de ler e de usar com bisect, o que combina com o seu branch de feature antes da revisão. Muitos times fazem rebase no privado e merge no público.
Se ainda estiver em andamento, git rebase --abort volta tudo ao que era. Se já terminou, rode git reflog, encontre a entrada logo antes do início do rebase e faça git reset --hard para esse hash. ORIG_HEAD também aponta para a ponta antiga logo depois de um rebase, a menos que outro comando a tenha mudado.
Não faça rebase de commits sobre os quais outras pessoas já basearam trabalho. O rebase cria commits novos com hashes novos, então quem tem os antigos acaba com histórico duplicado e conflitos confusos.
Os dois juntam um commit ao que está acima dele. squash abre o editor para você combinar as duas mensagens; fixup descarta a mensagem do commit absorvido e mantém a anterior. fixup -C mantém a mensagem do commit absorvido no lugar.
Cada commit é aplicado de novo sobre a nova base, e um commit que mexeu nas mesmas linhas que a base não pode ser aplicado automaticamente. Edite o arquivo, rode git add nele e rode git rebase --continue. Pode haver um conflito por commit reaplicado.
git rebase -i abre uma todo list com uma linha por commit, com o mais antigo no topo. Troque a palavra no início de uma linha, salve e feche o editor, e o git executa a lista de cima para baixo.
Comandos da todo list no git rebase -i
Faça fetch antes para a main estar atualizada, faça o rebase, resolva qualquer conflito e depois envie o branch reescrito com segurança.
Encontre a linha logo antes do início do rebase e faça reset do branch de volta para ela.
--onto recebe três pontos: a nova base, a base antiga e o branch. Só os commits depois da base antiga são movidos.
feature-b foi criado a partir de feature-a. Isto coloca só os commits próprios de feature-b em cima da main.
Merge ou rebase: o que acontece com o histórico
Escolha como combinar os branches
Merge
Rebase
merge commit
O merge mantém F1 e F2 intactos e adiciona um commit novo com dois pais.
O rebase copia F1 e F2 para cima de M3. As cópias (marcadas com ') têm hashes novos; os originais ficam para trás.
Planejador de rebase interativo
Escolha uma ação para cada commit, do mais antigo ao mais novo, e veja a todo list e o resultado.
Ação para o commit {n}
Todo list que o git abre
Histórico depois do rebase
A primeira linha não pode ser squash nem fixup: não há commit acima dela para juntar.
Todos os commits foram descartados. O branch apontaria para a sua base.
inclui {n} commit(s) absorvido(s)
mensagem editada
Comece grátis · Sem cartão de crédito