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