Tags e releases
Uma tag é um rótulo fixo que marca um commit específico, normalmente para apontar uma versão publicada. Diferente de uma branch, ela não se move.
git tag v1.4.0 # tag leve no commit atual
git tag -a v1.4.0 -m "Release 1.4.0" # tag anotada (com autor e mensagem)
git push origin v1.4.0 # publica a tag (push não envia tags por padrão)
git push origin --tags # publica todas as tags
Uma release é a publicação formal de uma versão: a tag + notas de mudanças (changelog) + artefatos (binários, pacotes). No GitHub é criada a partir de uma tag.
Versionamento semântico (SemVer)
SemVer atribui a cada versão três números: MAJOR.MINOR.PATCH (p. ex.
2.4.1). Cada um comunica o tipo de mudança:
- MAJOR: mudanças incompatíveis (quebram a API pública). Subir MAJOR
reinicia MINOR e PATCH para
0.2.4.1->3.0.0. - MINOR: nova funcionalidade compatível com versões anteriores. Reinicia PATCH para
0.2.4.1->2.5.0. - PATCH: correções de bugs compatíveis.
2.4.1->2.4.2.
| Mudança | Exemplo | Salto |
|---|---|---|
| Quebra a API | Você remove um parâmetro obrigatório | MAJOR |
| Adiciona sem quebrar | Novo método opcional | MINOR |
| Arruma um bug | Você corrige um cálculo | PATCH |
~1.2.3 -> permite PATCH: >=1.2.3 <1.3.0
^1.2.3 -> permite MINOR: >=1.2.3 <2.0.0 (padrão no npm)
Encaixa com Conventional Commits:
fix:-> PATCH,feat:-> MINOR,feat!:/BREAKING CHANGE-> MAJOR.
Monorepo vs polyrepo
- Polyrepo: um repositório por projeto/pacote. Isolamento claro e permissões por repo, mas compartilhar código e coordenar mudanças entre repos é mais custoso.
- Monorepo: muitos projetos/pacotes em um único repositório. Facilita compartilhar código, refactors atômicos que cruzam pacotes e uma única fonte de verdade. Em troca, exige ferramentas (Nx, Turborepo, workspaces de pnpm/npm) e uma boa CI para não construir/testar tudo a cada mudança.
meu-monorepo/
├── package.json # workspaces
├── apps/
│ ├── web/
│ └── api/
└── packages/
├── ui/
└── utils/
Não há "vencedor" universal: o monorepo brilha quando os pacotes estão muito acoplados e são versionados/implantados juntos; o polyrepo, quando são independentes e gerenciados por equipes separadas.