Usando rebase do Git
Neste exemplo, abordaremos todos os comandos disponíveis, exceto .
Vamos começar nossa troca de base inserindo no terminal. O nosso editor de texto favorito mostrará as seguintes linhas:
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
Neste exemplo, vamos:
- Faça uma mesclagem squash do quinto commit () no commit () usando .
- Mova o último commit () para cima antes do commit () e mantenha-o como .
- Mescle o commit () no commit () e desconsidere a mensagem do commit usando .
- Divida o terceiro commit () em dois commits menores usando .
- Corrija a mensagem do commit digitado incorretamente () usando .
Ufa! Parece muito trabalho, mas, executando uma etapa de cada vez, podemos fazer essas alterações facilmente.
Para começar, precisamos modificar os comandos no arquivo para que fiquem assim:
pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods
Alteramos o comando de cada linha de para o comando no qual estamos interessados.
Agora, salve e feche o editor. Isso iniciará o rebase interativo.
O Git ignora o primeiro comando de troca de base, , pois ele não precisa fazer nada. Passa para o próximo comando. Como essa operação requer entrada de dados, o Git abre o editor de texto novamente. O arquivo aberto é parecido com este:
# This is a combination of two commits.
# The first commit's message is:
Patch A
# This is the 2nd commit message:
something to add to patch A
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a
#
Este arquivo é a maneira do Git de dizer: "Ei, é isto o que vou fazer com este ". Ele lista a mensagem do primeiro commit () e a do segundo commit (). Se você estiver satisfeito com essas mensagens de commit, salve o arquivo e feche o editor. Caso contrário, tem a opção de alterar a mensagem do commit simplesmente mudando o texto.
Depois que o editor é fechado, o rebase continua:
pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods
O Git processa os dois comandos (para e ). Ele também processa o comando (), pois não exige nenhuma interação. mescla as alterações de no commit antes dele, . As duas alterações terão a mesma mensagem de commit: .
O Git chega à operação , para e imprime a seguinte mensagem no terminal:
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
Neste ponto, você pode editar qualquer arquivo no projeto para fazer outras alterações. Para cada alteração feita, você precisará executar um novo commit e poderá fazer isso inserindo o comando . Quando terminar de fazer todas as alterações, execute o programa.
Em seguida, o Git executa o comando. Ele abre o editor de texto mais uma vez e apresenta as seguintes informações:
i cant' typ goods
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD^1 <file>..." to unstage)
#
# modified: a
#
Como antes, o Git mostra a mensagem do commit para você editar. Você pode alterar o texto (), salvar o arquivo e fechar o editor. O Git terminará o rebase e retornará ao terminal.
Fazer push de código com rebase para o GitHub
Como você alterou o histórico do Git, o procedimento padrão não funcionará. Você precisará modificar o comando efetuando um push forçado das suas alterações mais recentes.
# Don't override changes
$ git push origin main --force-with-lease
# Override changes
$ git push origin main --force
Aviso
Forçar push tem implicações sérias, pois ele muda a sequência histórica de commits para o branch. Use-o com cuidado, especialmente se o repositório estiver sendo acessado por várias pessoas.
Leitura adicional
- AUTOTITLE