No git, qual é a diferença entre mesclar –squash e rebase?

Eu sou novo para git e estou tentando entender a diferença entre um squash e um rebase. Pelo que entendi você executar uma abóbora ao fazer um rebase.

    Ambos git merge --squash e git rebase --interactive podem produzir um commit “squashed”.
    Mas eles servem a propósitos diferentes.

    • git merge --squash abranch

    irá produzir um commit esmagado na ramificação de destino, sem marcar nenhuma relação de mesclagem.
    (Nota: ele não produz um commit imediatamente: você precisa de um git commit -m "squash branch" adicional git commit -m "squash branch" )
    Isso é útil se você quiser descartar completamente o branch de origem, partindo de (esquema retirado da pergunta 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, em seguida, excluindo ramificação tmp .

    • git rebase --interactive

    replays alguns ou todos os seus commits em uma nova base, permitindo que você esmague (ou mais recentemente “conserte”, veja esta questão 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 do merge --squash , você pode escolher repetir alguns, e esmagar os outros).

    Então as diferenças são:

    • merge não toca no seu branch de origem ( tmp aqui) e cria um único commit onde você quer.
    • rebase permite que você vá na mesma ramificação de origem (ainda tmp ) com:
      • uma nova base
      • um histórico mais limpo

    Mesclar squash mescla uma tree (uma seqüência de commits) em um único commit. Isto é, esmaga todas as alterações feitas em n commits em um único commit.

    Rebasing é baseando-se novamente, isto é, escolhendo uma nova base (commit pai) para uma tree. Talvez o termo mercurial para isso seja mais claro: eles o chamam de transplante porque é só isso: escolher um novo terreno (pai, raiz) para uma tree.

    Ao fazer um rebase interativo, você tem a opção de abocanhar, escolher, editar ou pular os commits que você irá rebase.

    Espero que tenha sido claro!

    Merge commits: retém todos os commits do seu branch e intercala com commits no branch base insira a descrição da imagem aqui

    Mesclar Squash: retém as alterações, mas omite os commits individuais do histórico insira a descrição da imagem aqui

    Rebase: Move toda a ramificação do recurso para começar na ponta do branch master, incorporando efetivamente todos os novos commits no master

    insira a descrição da imagem aqui

    Mais aqui