Assuming you don’t care about retaining any of your existing commit messages, there’s a nifty (and fast) git recipe you can use. First, make sure your branch is checked out:
git checkout <branch-to-squash>
For safety, lets tag the current commit.
git tag my-branch-backup
Next, move the branch HEAD back to your last good commit (without modifying the workspace or index). EDIT: The last good commit is the most recent commit on your branch that you want to retain.
git reset --soft <last-good-commit>
Using git status, you’ll notice that all changes on your feature branch are now staged. All that’s left to do is …
git commit
This method is great for consolidating long, convoluted git histories and gnarly merges. Plus, there’s no merge/rebase conflicts to resolve!
Now, if you need to retain any of your existing commit messages or do anything fancier than the above allows, you’ll want to use git rebase --interactive.
Solution derived from: http://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
Reference: http://git-scm.com/docs/git-reset
Reference: http://git-scm.com/docs/git-rebase