Este método evita conflitos durante eo merge, se você tem que periódicamente fazer pull da master em sua branch. Também da a oportuniadade de realizar squash em mais de um commit ou para re-organizar seu código completamente em diferentes commits (ex: se você terminou seu trabalho em três diferente features mas os commits não foram consecutivos).
*Nota: Você não pode usar esse método se você pretende abrir um Pull Request para realizer merge da sua branch. Esse método requer commits diretamente na master.
Troque para a branch master e certifique-se de estar tudo atualizado:
git checkout master && git pull
Faça merge sua feature branch na master localmente:
git merge feature_branch
Resete a sua branch local master para o estado de origem.
git reset origin/master
Agora todas as suas mudanças são consideradas como "unstaged". Você pode coloca-las em "stage" e realizar o commit delas em um ou mais commits.
git add . --all
git commit
(Fonte)
Este método somente permite você realizar squash dos últimos X consecutivos commits. Também, se você tiver realizado merge da master em sua branch ao longo do caminho, você terá que realizar merge manualmente o seu novo (squashed) commit na master e resolver os conflitos.
use este método se você não realizou merge da maste em sua branch, e planeja combinar todos os commits em um, e você pode mudar apenas uma featuro do projeto; ou, independente das condições, você deve user esse método se planeja abrir um Pull Request para mesclar seu código.
Para realizar squas dos últimos 3 commits em um:
git reset --soft HEAD~3
git commit -m "New message for the combined commit"
git push origin +name-of-branch
The plus sign forces the remote branch to accept your rewritten history, otherwise you will end up with divergent branches
git push origin name-of-branch
Em outras palavras, apenas um push normal como outro qualque
Fonte principal: http://stackoverflow.com/a/5201642/348995 Fonte para informações sobre quando fazer commit onde já foi submetido: http://stackoverflow.com/a/5668050/348995