Github flow [1] for me - which is basically what others have mentioned about branching feature branches directly from main and merging as soon as the pull request is approved.
I personally prefer a simplified version of git-tag-flow: https://github.com/vasdee/git-tag-flow
I hate git-flow with a passion.
I work in a feature branch, the tech lead does a code review (for real!) then merges to develop, the tester tests the develop branch, if it passes that gets merged to the master branch, the prod system is updated, the tester tests it again.
Short lived branches. If tests are green and it passes code review, squash merge, bump the release, and deploy. Never force push anything ever. Rewriting history is bad.
It is all about reducing feedback cycles.
Still on Gitflow.
It's rather simple for a new employee to understand, meshes in nicely with CI/CD systems and the release processes of the places I worked at.
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.