Tags: marcando versões com git tag
1. Introdução às tags no Git
Tags no Git são marcadores estáticos que apontam para um commit específico no histórico do repositório. Diferentemente de branches, que se movem conforme novos commits são adicionados, as tags permanecem fixas no commit em que foram criadas. Essa característica as torna ideais para marcar versões de software, releases, marcos importantes ou qualquer ponto no histórico que precise ser referenciado de forma permanente.
A principal diferença entre tags e branches é que branches continuam evoluindo com novos commits, enquanto tags são imutáveis. Você não faz commits em uma tag — ela serve apenas como um ponto de referência congelado no tempo.
Tags são amplamente utilizadas para:
- Marcar versões de release (v1.0.0, v2.3.1)
- Identificar versões estáveis em produção
- Sinalizar marcos importantes no desenvolvimento
- Facilitar a navegação em versões específicas do código
2. Tipos de tags: leves vs anotadas
O Git oferece dois tipos de tags: leves (lightweight) e anotadas (annotated).
Tags leves são marcadores simples que contêm apenas o nome da tag e o hash do commit. São criadas com:
git tag v1.0.0-light
Tags anotadas armazenam metadados adicionais como autor, data, mensagem e podem ser assinadas digitalmente. São criadas com:
git tag -a v1.0.0 -m "Versão estável 1.0.0 - Lançamento oficial"
As tags anotadas são recomendadas para releases oficiais, pois preservam informações importantes sobre quem criou a tag, quando e por quê. Tags leves são mais adequadas para marcações temporárias ou pessoais.
3. Criando e listando tags
Para criar uma tag no commit atual do repositório:
git tag v1.0.0
git tag -a v2.0.0 -m "Grande atualização com novas funcionalidades"
Para criar uma tag em um commit específico, use o hash do commit:
git tag v0.9.0 a1b2c3d4
git tag -a v0.9.0-beta -m "Versão beta anterior ao release" a1b2c3d4
Para listar todas as tags existentes:
git tag
É possível usar padrões para filtrar tags:
git tag -l "v1.*"
git tag -l "*-stable"
4. Visualizando e detalhando tags
Para exibir informações detalhadas de uma tag anotada:
git show v1.0.0
A saída inclui o autor da tag, data, mensagem e as diferenças do commit em relação ao commit anterior. Para tags leves, git show exibe apenas as informações do commit.
Para descobrir o hash do commit ao qual uma tag aponta:
git rev-parse v1.0.0
Isso retorna o hash completo do commit, útil para scripts e automação.
5. Compartilhando tags com repositórios remotos
Por padrão, git push não envia tags para o repositório remoto. É necessário explicitamente enviá-las:
git push origin v1.0.0
Para enviar todas as tags locais que ainda não existem no remoto:
git push origin --tags
Para baixar tags do repositório remoto:
git fetch --tags
A diferença entre git push sem tags e com --tags é que o primeiro envia apenas commits e branches, enquanto o segundo também envia todas as tags locais. É recomendável enviar tags individualmente para releases importantes, garantindo controle sobre o que é compartilhado.
6. Removendo e renomeando tags
Para remover uma tag localmente:
git tag -d v1.0.0-beta
Para remover uma tag do repositório remoto:
git push origin --delete v1.0.0-beta
Ou usando a sintaxe alternativa:
git push origin :refs/tags/v1.0.0-beta
Renomear tags não é uma operação direta no Git. O processo envolve criar uma nova tag com o nome desejado e deletar a antiga:
git tag v1.0.0-final v1.0.0-rc
git tag -d v1.0.0-rc
git push origin v1.0.0-final
git push origin --delete v1.0.0-rc
7. Usando tags para criar releases e navegar no histórico
Para criar uma release a partir de uma tag, muitas plataformas como GitHub, GitLab e Bitbucket permitem criar releases diretamente das tags. O processo geralmente envolve:
- Criar a tag anotada no commit desejado
- Enviar a tag para o repositório remoto
- Na interface da plataforma, criar uma release associada à tag, adicionando notas de release e artefatos
Para navegar até o estado do código em uma tag específica:
git checkout v1.0.0
Isso coloca o repositório em estado "detached HEAD", onde você está visualizando o commit da tag, mas não em um branch. Nesse estado, você pode inspecionar o código, compilar ou testar, mas commits feitos aqui não pertencem a nenhum branch. Para voltar a um branch:
git checkout main
Em scripts e automação de CI/CD, tags são frequentemente usadas para:
- Disparar pipelines de deploy quando uma tag é criada
- Versionar artefatos de build
- Gerar changelogs automaticamente
- Controlar versões em ambientes de produção
Exemplo de script simples que lista todas as tags e suas datas:
#!/bin/bash
for tag in $(git tag)
do
echo "$tag: $(git log -1 --format=%ai $tag)"
done
Tags são ferramentas essenciais no Git para gerenciamento de versões, oferecendo uma maneira clara e permanente de marcar pontos importantes no histórico do repositório. Combinadas com boas práticas de versionamento semântico, elas facilitam a comunicação entre equipes, automatizam processos de release e mantêm o histórico do projeto organizado e navegável.
Referências
- Git Documentation - Git Tag — Documentação oficial do comando git tag, com todas as opções disponíveis
- Pro Git Book - Tagging — Capítulo completo sobre tags no livro Pro Git, com exemplos práticos
- Atlassian - Git Tag Tutorial — Tutorial detalhado sobre tags com exemplos de uso em equipes
- GitHub Docs - Managing releases in a repository — Guia oficial do GitHub sobre como criar releases a partir de tags
- Semantic Versioning Specification — Especificação oficial de versionamento semântico, frequentemente usada em conjunto com tags Git