Considering how widespread usage of git has become, it is quite interesting that there is still huge variety in how it is actually used for development flows of different projects. There are various debates on topic but here I am going to focus specifically on "merge vs rebase vs squash" and general topic of integrating changes.
Despite lot of controversy, I am convinced this is actually a reasonably solved problem and there is a uniform approach that addresses majority of use cases - and that it is somewhat different from what services like Bitbucket or GitHub encourage.
This article assumes some pre-existing knowledge of how merge and rebase works, as well as general git proficiency. If this is not the case, already linked Atlassian article explains it with plenty of easy to follow visuals.