Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIntermediáriocódigo testado

git tag e release no GitHub: marcar versões do projeto

Tag leve e tag anotada, versionamento semântico, o push que esquece as tags e como transformar uma tag em release com changelog gerado pelo próprio git log.

Rodolfo Mori4 min de leitura

Tag é um nome estável para um ponto do histórico. Ela permite dizer qual commit virou v1.1.0 sem depender de uma branch que continua avançando. Release é uma camada do GitHub sobre uma tag, com notas, arquivos e página de distribuição.

Os testes criaram tags e as enviaram a um bare local. Nenhuma release externa foi criada no GitHub.

bash
git tag --list
v1.0.0 v1.1.0

Tag leve é um nome direto

A versão leve foi criada sobre o commit de Refatoração:

bash
git tag v1.0.0 452b88da13703d40fffc47cc3a0f153c2635f1b2
git --no-pager show --no-patch --format=fuller v1.0.0
commit 452b88da13703d40fffc47cc3a0f153c2635f1b2 Author: Ana Souza <ana@example.test> AuthorDate: Mon Aug 24 21:34:54 2026 -0300 Commit: Ana Souza <ana@example.test> CommitDate: Mon Aug 24 21:34:54 2026 -0300
plaintext
feat: adiciona Refatoração</div>

Ela não cria objeto de tag separado com mensagem e tagger. Funciona para um marcador privado ou temporário, mas oferece menos contexto de lançamento.

Tag anotada registra quem marcou e por quê

bash
git tag -a v1.1.0 -m "Release 1.1.0" b287fa57448a24cf40125b2ab36e47fecce086f9
git --no-pager show --no-patch --format=fuller v1.1.0
tag v1.1.0 Tagger: Ana Souza <ana@example.test> TaggerDate: Mon Aug 24 14:00:00 2026 -0300

Release 1.1.0

commit b287fa57448a24cf40125b2ab36e47fecce086f9 feat: adiciona DDD

Tag anotada é um objeto com mensagem, identidade e data. Para versões publicadas, esse contexto costuma justificar a escolha. Assinatura criptográfica é uma camada adicional e exige gestão de chaves; não foi configurada no teste.

SemVer comunica compatibilidade, não qualidade

Em MAJOR.MINOR.PATCH, patch corrige sem quebrar contrato, minor adiciona funcionalidade compatível e major permite quebra. A regra depende de você ter um contrato público. Um site interno sem consumidores pode usar outra política, mas precisa documentá-la.

Não promova uma correção para minor só porque parece importante. A pergunta é se o consumidor precisa alterar uso. Pré-lançamentos como 1.2.0-beta.1 ajudam a testar, mas tag continua sendo apenas referência; pipeline e release dão o restante do processo.

Push de branch não leva todas as tags

O primeiro push publicou a branch e deixou as tags locais:

bash
git push -u release feat/catalogo
git ls-remote --tags release
To /tmp/grupo-git-tags.WVylkT/central.git * [new branch] feat/catalogo -> feat/catalogo branch 'feat/catalogo' set up to track 'release/feat/catalogo'.

O segundo comando não escreveu nenhuma referência de tag, porque o push da branch não havia enviado tags.

Essa separação evita publicar marcadores locais por acidente. --follow-tags envia tags anotadas alcançáveis pelos commits transferidos:

bash
git push release --follow-tags
To /tmp/grupo-git-tags.WVylkT/central.git * [new tag] v1.1.0 -> v1.1.0

A leve v1.0.0 permaneceu local. --tags enviou todas:

bash
git push release --tags
git ls-remote --tags release
To /tmp/grupo-git-tags.WVylkT/central.git * [new tag] v1.0.0 -> v1.0.0 452b88da13703d40fffc47cc3a0f153c2635f1b2 refs/tags/v1.0.0 2a275192dcf4763eb293f347b1f7e98563587112 refs/tags/v1.1.0 b287fa57448a24cf40125b2ab36e47fecce086f9 refs/tags/v1.1.0^{}

A linha com ^{} resolve a tag anotada para o commit. A outra aponta para o objeto da tag.

Corrija uma tag publicada com coordenação

Tag é estável por convenção, mas o Git permite apagar e recriar. Isso não atualiza automaticamente clones de outras pessoas: elas podem continuar com o objeto antigo e até reenviá-lo. Por isso, uma versão publicada errada exige aviso, decisão de compatibilidade e instrução explícita para consumidores.

No sandbox, uma tag de teste foi enviada e removida das duas pontas:

bash
git push release v1.1.1
git tag -d v1.1.1
git push release --delete v1.1.1
To /tmp/grupo-git-tags.WVylkT/central.git * [new tag] v1.1.1 -> v1.1.1 Deleted tag 'v1.1.1' (was b287fa5) To /tmp/grupo-git-tags.WVylkT/central.git - [deleted] v1.1.1

Esse procedimento demonstra a mecânica, não recomenda reutilizar números. Se uma versão foi consumida, normalmente é mais claro publicar v1.1.2 com a correção e explicar v1.1.1 nas notas. Assim caches, automações e pessoas não recebem conteúdos diferentes sob o mesmo nome.

Antes de remover, use git show para confirmar o alvo e git ls-remote --tags para verificar a referência no servidor. Depois, confira a política de releases da equipe. Uma tag pode disparar deploy, pacote ou assinatura; apagar o nome não desfaz necessariamente esses efeitos externos.

Changelog nasce do intervalo real

Liste commits depois de uma versão e até outra:

bash
git --no-pager log v1.0.0..v1.1.0 --oneline
b287fa5 feat: adiciona DDD

Esse resultado é matéria-prima, não nota pronta. Traduza commits técnicos em mudanças relevantes para quem usa, destaque migrações e inclua instruções de compatibilidade. Conventional Commits ajuda a classificar, mas não entende o impacto sozinho.

Release do GitHub exige uma decisão humana

Na interface, selecione uma tag publicada, dê título e escreva notas. Você pode anexar artefatos produzidos pelo pipeline. Este material não possui autorização para criar release, então limita a prova ao objeto Git e referencia a documentação oficial para a tela.

Ao entrar numa tag para investigar, HEAD fica detached. Crie branch se for corrigir; não mova a tag publicada silenciosamente. Para apagar, remova local e remota com coordenação, sabendo que clones podem manter a referência antiga.

Antes de marcar, exija working tree limpa, testes aprovados e commit integrado na branch de entrega. Uma tag criada na branch errada continua tecnicamente válida e operacionalmente falsa. Confira git status, git branch --show-current e git show --no-patch HEAD; depois compare a tag recém-criada ao mesmo hash. Se o projeto produz artefatos, gere-os a partir do commit marcado, não de arquivos locais que ficaram fora do histórico.

Registre também quem pode publicar versões e como uma correção urgente avança o número. Esse acordo evita duas tags competindo pelo mesmo lançamento e deixa o changelog alinhado ao que realmente chegou ao consumidor.

Sua missão é criar uma tag leve e outra anotada, comparar git show, enviar com --follow-tags e conferir o que ficou de fora. Termine com um changelog entre as duas e conecte a entrega ao README, ao rebase e ao fluxo de equipe.

  • git
  • tag
  • release
  • semver
  • changelog

Perguntas frequentes

Uma tag muda quando a branch avança?
Não. A tag continua apontando para o objeto marcado. Para corrigir uma tag publicada, coordene a remoção e recriação porque outras cópias podem manter o valor antigo.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em git version 2.54.0 (Apple Git-156) no macOS 27, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. Git — git tag — git-scm.com
  2. GitHub Docs — Sobre releases — docs.github.com

Continue por aqui