Olá, estudante. Tudo bem?
Uma forma comum de nomear as branches seria uma para desenvolvimento (develop ), outra para QA (stage) e outra para deploy em produção (main). Ao lado disso, também pode ocorrer que se crie uma branch para cada feature que for ser desenvolvida, tipo feat-xyz, ou até mesmo, para times que usam softwares de gerenciamento de projeto (tipo o Jira), usar uma branch com o identificador do card que gerou aquela modificação no código. Sendo que depois de finalizar aquele card, você faz o merge com as outras branches.
A branch main, geralmente, é onde o código mais atualizado e que está em ambiente de produção, com acesso dos usuários finais.
É possível bloquear o push direto na branch main, forçando pull requests, revisão de código por outros desenvolvedores etc, mas aí vai ser uma decisão dependendo das necessidades e do contexto.
Espero ter ajudado. Bons estudos!