One of the side-effects of using git branching aggressively is that you end up with a lot of branches in both the local and remote repositories.
For cleaning up branches on remote git repositories I use git-sweep. To remove local branches tied to remote branches that no longer exists I run git fetch --prune. This helps a lot but it doesn't handle the issue of local branch proliferation.
git branch --contains mybranch will list the branches that contain the commits of mybranch, i.e., the branches that mybranch has been merged into. If a branch has been merged into many branches it is a good candidate for cleanup.
To get a count of the number of branches all local branches have been merged into:
for k in $(git branch | tr -d "*");do git branch --contains "$k" | wc -l | tr -d '\n\t '; echo " $k" ;done | sort -n