Cenário
Ao trabalhar em um branch de recurso, faço algumas alterações em um arquivo e, em seguida, submeto essas alterações. Mais tarde, faço algumas alterações adicionais no mesmo arquivo nas mesmas linhas e quero esmagar essas alterações no primeiro commit que toca no arquivo.
Git rebase
Você pode fazer um rebase --interactive
(ou git rebase -i
para abreviar) e alterar a linha de commit de a pick
para a fixup
e colocar o commit abaixo do commit a ser comprimido.
Isso limpa seus commits, mas pode ser tedioso se você tiver mais do que apenas alguns commits que deseja esmagar. É aí que --autosquash
entra em cena.
Na página man git-rebase:
–autosquash
Quando a mensagem de log do commit começa com “squash! …” (ou “fixup! …”), e há um commit cujo título começa com o mesmo …, modifica automaticamente a lista de tarefas do rebase -i para que o commit marcado para squashing venha logo após o commit a ser modificado, e mude a ação do commit movido de pick para squash (ou fixup).
Então, prefixando a mensagem de confirmação com fixup!
ou squash!
seguido pelo texto da mensagem de confirmação a ser comprimida, um rebase interativo configurará a lista de tarefas para você automaticamente.
Exemplo
Digamos que eu tenha três commits ( git log
) e desejo que o commit 5929914
seja comprimido em commit 13e88b0
:
commit 5929914169c97c08e9da967ba5f6d49704aaa999
More changes to Fix query for finding rows
commit 11c85ef5b907541b1b5f8fa7ef72e5d2c4f7b55c
Add unique constraint for calendar audiences
commit 13e88b0f2ec738b7ae61cc91a80067f0aed91c32
Fix query for finding rows
Quando emito git rebase HEAD~3 -i
, vejo a seguinte lista:
pick 13e88b0 Fix query for finding rows
pick 11c85ef Add unique constraint for calendar audiences
pick 5929914 More changes to Fix query for finding rows
Se eu reformular minha mensagem de confirmação de acordo com a documentação para ser a seguinte, a confirmação deve ser posicionada automaticamente sob confirmação com a ação alterada para :--autosquash
5929914
13e88b0
fixup
commit 5929914169c97c08e9da967ba5f6d49704aaa999
fixup! Fix query for finding rows
commit 11c85ef5b907541b1b5f8fa7ef72e5d2c4f7b55c
Add unique constraint for calendar audiences
commit 13e88b0f2ec738b7ae61cc91a80067f0aed91c32
Fix query for finding rows
Agora, com o comando: Eu obtenho o seguinte alterado automaticamente na minha lista de tarefas:git rebase HEAD~3 -i --autosquash
pick 13e88b0 Fix query for finding rows
fixup 5929914 fixup! Fix query for finding rows
pick 11c85ef Add unique constraint for calendar audiences
Voila! Agora pare de desperdiçar seu tempo movendo em torno de consertos e squash