No Git com o poder do rebase
podemos efetuar merge de vários commits em apenas um, facilitando muito a nossa vida quando temos muitos commits e precisamos encaminhar isso a outros ambientes.
Segundo a documentação oficial o comando git-rebase
é um dos comandos especializados em integrar alterações de uma branch para outra, com ele é possível reescrever o log.
Inicialize uma sessão para o rebase e visualize o conteúdo dos commits.
Logo após o HEAD temos o N
que é referente ao número de commits que você deseja agrupar a partir do último, do mais recente.
git rebase --interactive HEAD~N
Vou exemplificar abaixo uma lista imaginária de commits, adicionando o módulos "foo" ao projeto, você também pode buscar a sua lista executando o comandogit log -5
, para exibir os últimos 5 commits:
12a3fs [T-2578] - Final changes module foo ---> commit mais recente 5d22oc [T-2578] - Adds unit tests 8b3sac [T-2578] - Changes module foo 2 a29m70 [T-2578] - Changes module foo 3294qa [T-2578] - Add module foo ---> commit mais antigo
Esse é um exemplo básico, utilizando o N como 5
, agrupando os últimos 5 commits a partir do mais recente:
12a3fs [T-2578] - Final changes module foo --┐ 5d22oc [T-2578] - Adds unit tests | 8b3sac [T-2578] - Changes module foo 2 | --> agrupar todos em apenas 1 a29m70 [T-2578] - Changes module foo | 3294qa [T-2578] - Add module foo --┘
Ao executar o comando anterior você deve ter caído em modo de edição com o seu editor configurado contendo os commits na forma inversa apresentada no passo anterior.
Aqui podemos definir varios comandos para os commits, os que eu mais utilizo são: pick, squash, reword
, pick (p) para usar o commit, squash (s) para usar o commit mas mesclar com o commit anterior e (r) para modificar o texto de algum commit:
pick 12a3fs [T-2578] - Final changes module foo ---> commit mais recente pick 5d22oc [T-2578] - Adds unit tests pick 8b3sac [T-2578] - Changes module foo 2 pick a29m70 [T-2578] - Changes module foo pick 3294qa [T-2578] - Adds module foo ---> commit mais antigo # Rebase 12a3fs..3294qa onto 8ow2a3s # # 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 # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
Agora o nosso objetivo é marcar os commits que queremos agrupar como squashable
, você pode ver mais a respeito na documentação da reescrita de histórico.
Você pode utilizar o atalho s
ao invés de squash
para facilitar:
p 12a3fs [T-2578] - Final changes module foo ---> commit mais recente s 5d22oc [T-2578] - Adds unit tests s 8b3sac [T-2578] - Changes module foo 2 s a29m70 [T-2578] - Changes module foo s 3294qa [T-2578] - Adds module foo ---> commit mais antigo
Segundo passo concluído! Salve as alterações e saia do modo de edição.
Após realizar o agrupamento agora é a hora de "commitarmos" o agrupamento, definindo um nome.
Você deve ter sido redirecionado justamente para essa sessão, onde constam as descrições de cada commit agrupado, você pode apagar todas essas linhas e definir apenas um nome para todo esse esforço.
12a3fs [T-2578] - Final changes module foo 5d22oc [T-2578] - Adds unit tests 8b3sac [T-2578] - Changes module foo 2 a29m70 [T-2578] - Changes module foo 3294qa [T-2578] - Adds module foo
Alterando para o nome que for mais coerente, exemplo:
Includes module foo
Até a próxima!
Voltar