Normalmente, você usará git rebase para:
- Editar mensagens de commits anteriores
- Combinar múltiplos commits em um único
- Excluir ou reverter commits que não são mais necessários
Aviso
Como a alteração do seu histórico de commits pode dificultar as coisas para todos os outros que usam o repositório, é considerada uma prática inadequada efetuar rebase de commits quando você já efetuou push deles para um repositório. Para saber como trocar de base com segurança, confira Sobre fusões de pull-request.
Fazer rebase de commits em um branch
Para rebasear todos os commits entre outro branch e o estado atual do seu branch, você pode inserir o seguinte comando no shell (o prompt de comando para Windows ou o terminal para Mac e Linux):
git rebase --interactive OTHER-BRANCH-NAME
Fazer rebase de commits em um momento específico
Para fazer rebase dos últimos commits em seu branch atual, você pode inserir o seguindo comando no shell:
git rebase --interactive HEAD~7
Comandos disponíveis ao fazer rebase
Há seis comandos disponíveis para fazer rebase:
pick-
picksignifica simplesmente que o commit está incluído. A reorganização da ordem dos comandospickaltera a ordem dos commits quando a troca de base está em andamento. Se você optar por não incluir um commit, será preciso excluir a linha toda. reword- O comando
rewordé semelhante apick, mas depois que você usá-lo, o processo de troca de base será colocado em pausa e dará a você a chance de alterar a mensagem de commit. As alterações feitas pelo commit não são afetadas. edit- Se você optar por
editum commit, terá a chance de modificar o commit, o que significa que pode adicionar ou alterar o commit por completo. Também é possível fazer mais commits antes de continuar com o rebase. Isso permite que você divida um commit grande em commits menores ou remova alterações equivocadas feitas em um commit. squash- Esse comando permite combinar dois ou mais commits em um único commit. Um commit é mesclado por squash ao commit anterior. O Git permite que você grave uma nova mensagem do commit descrevendo ambas as alterações.
fixup- Isso é semelhante a
squash, mas o commit a ser mesclado tem sua mensagem descartada. O commit é simplesmente mesclado ao commit acima dele, e a mensagem do commit anterior é usada para descrever as duas alterações. exec- Permite que você execute comandos de shell arbitrários num commit.
Um exemplo de uso de git rebase
Independentemente do comando usado, o Git iniciará o editor de texto padrão e abrirá um arquivo que fornece detalhes dos commits no intervalo escolhido. Esse arquivo é parecido com este:
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Ao dividir essas informações, de cima para baixo, observamos que:
- Sete commits são listados, o que indica que ocorreram sete alterações desde nosso ponto de partida até o estado atual do nosso branch.
- Os commits escolhidos para rebase são ordenados na ordem das alterações mais antigas (no topo) para as mais recentes (em baixo).
- Cada linha lista um comando (por padrão,
pick), o SHA do commit e a mensagem de commit. Todo o procedimentogit rebasegira em torno da manipulação dessas três colunas. As alterações feitas têm o rebase no repositório. - Após os commits, o Git informa o intervalo de commits com o qual estamos trabalhando (
41a72e6..7b36971). - Por fim, o Git fornece alguma ajuda informando a você os comandos que estão disponíveis ao fazer rebase dos commits.
Leitura adicional
-
[AUTOTITLE](/get-started/using-git/using-git-rebase-on-the-command-line) -
[O capítulo "Ramificação do Git" do _livro Pro Git_](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) -
[O capítulo "Troca de base interativa" do _livro Pro Git_](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#_changing_multiple) -
[Mesclagem squash de commits com rebase](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) -
[AUTOTITLE](/desktop/working-with-your-remote-repository-on-github-or-github-enterprise/syncing-your-branch-in-github-desktop) na documentação de GitHub Desktop