Start here. This is the direct spoken answer to practice first.
Why this question matters
A shared Git workflow connects daily collaboration with review quality, deployable history, release traceability, and incident recovery. Main needs a clear protection policy, while ordinary changes and urgent fixes need paths the team can follow consistently.
I would keep the main branch protected and use short-lived feature branches for normal work. Changes should go through pull requests so the team can review code, tests, migrations, and deployment impact before merge. I prefer small branches that are easy to review over long-running branches that collect many unrelated changes. The goal is to keep main in a deployable state.