Respostas:
Ambos git merge --squash
e git rebase --interactive
podem produzir um commit "esmagado".
Mas eles servem a propósitos diferentes.
produzirá uma confirmação compactada na ramificação de destino, sem marcar nenhum relacionamento de mesclagem.
(Nota: ele não produz um commit imediatamente: você precisa de um adicional git commit -m "squash branch"
)
Isso é útil se você deseja descartar completamente o ramo de origem, saindo de (esquema retirado da pergunta do SO ):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
para:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
e excluindo tmp
ramificação.
Nota: git merge
tem uma --commit
opção , mas não pode ser usada com --squash
. Nunca foi possível usar --commit
e --squash
juntos.
Desde o Git 2.22.1 (terceiro trimestre de 2019), essa incompatibilidade é explicitada:
Veja commit 1d14d0c (24 de maio de 2019) por Vishal Verma ( reloadbrain
) .
(Incorporado por Junio C Hamano - gitster
- in commit 33f2790 , 25 de jul de 2019)
merge
: recusar--commit
com--squash
Anteriormente, quando
--squash
era fornecido 'option_commit
', era silenciosamente descartado. Isso pode ter sido surpreendente para um usuário que tentou substituir o comportamento de não confirmação da squash usando--commit
explicitamente.
git/git
builtin/merge.c#cmd_merge()
agora inclui:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
repete alguns ou todos os seus commits em uma nova base, permitindo que você esmague (ou mais recentemente "conserte", consulte esta pergunta SO ), indo diretamente para:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Se você optar por esmagar todos os commits de tmp
(mas, ao contrário de merge --squash
, poderá repetir alguns e esmagar outros).
Então as diferenças são:
squash
não toca na ramificação de origem ( tmp
aqui) e cria um único commit onde você deseja.rebase
permite que você continue no mesmo ramo de origem (ainda tmp
) com:
tmp
commits compactados juntos.
G
não representará o mesmo conteúdo que g
, devido às alterações introduzidas por X
.
git merge --no-ff temp
vez de git merge --squash temp
, obtém uma história mais confusa, mas também pode fazer coisas como git revert e
, com muito mais facilidade. É uma história confusa, mas honesta e pragmática, e o ramo principal ainda permanece bastante limpo.
git bisect
ou git blame
quando usado com muita frequência (como em git pull --no-ff
: stackoverflow.com/questions/12798767/… ). Não há uma abordagem de qualquer maneira, é por isso que este artigo descreve três ( stackoverflow.com/questions/9107861/... )
Mesclar confirmações: retém todas as confirmações em sua ramificação e as intercala com confirmações na ramificação base
Merge Squash: retém as alterações, mas omite o indivíduo confirma o histórico
Rebase: move a ramificação inteira do recurso para começar na ponta da ramificação principal, incorporando efetivamente todas as novas confirmações no mestre
Mais aqui
O squash de mesclagem mescla uma árvore (uma sequência de confirmações) em uma única confirmação. Ou seja, esmaga todas as alterações feitas em n confirma em um único commit.
Rebasear é basear novamente, ou seja, escolher uma nova base (confirmação pai) para uma árvore. Talvez o termo mercurial para isso seja mais claro: eles chamam de transplante porque é exatamente isso: escolher um novo terreno (confirmação dos pais, raiz) para uma árvore.
Ao fazer uma nova reformulação interativa, você terá a opção de esmagar, selecionar, editar ou pular as confirmações que você irá refazer.
Espero que isso esteja claro!
Vamos começar pelo seguinte exemplo:
Agora temos 3 opções para mesclar alterações da ramificação do recurso na ramificação principal :
Confirmação de mesclagem Manterá
todo o histórico de confirmações da ramificação de recursos e as moverá para a ramificação principal
.
Rebase and mesclagem
Anexará todo o histórico de confirmações da ramificação de recursos na frente da ramificação mestre
. NÃO adicionará confirmação fictícia extra.
Squash e mesclagem
Agrupam todas as confirmações de ramificação de recursos em uma confirmação e depois anexam-na na frente da ramificação principal
.
Você pode encontrar abaixo como o ramo mestre cuidará de cada um deles.
Em todos os casos:
podemos excluir com segurança o ramo do recurso .
G
éc--d--e--f--g
esmagado junto?