I usually have a master branch, feature branches and version branches. Whenever I want to add commits from another branch to master or to a feature branch, I use merge, so that I can always understand what changes happened. However, once I think the whole thing is stable enough for a release, I rebase master (or a fix-branch) into the according version branches. That way, the history in the version branches is not so cluttered and I can see when I added what without the specifics.