My personal recommendation:
Development happens on short lived branches, gets merged to master via pull request after code review if needed, but at least some automated testing should be done.
NEVER DO MERGE COMMITS: Always rebase + fast forward merging only.
Branches that never reached production and likely never will should be discarded after a while.
Branches that reached production e.g. hotfix branches should be converted to tags after a while.