Qual é a diferença entre uma tag anotada e não anotada?

333

Se eu quiser marcar o commit atual. Sei que as duas linhas de comando a seguir funcionam:

git tag <tagname>

e

git tag -a <tagname> -m '<message>'

Qual é a diferença entre esses comandos?

user462301
fonte
1
@ Thilo Esta não é uma cópia exata. A pergunta referenciada é sobre quando anotar, não sobre os sinalizadores relacionados.
Todd A. Jacobs
1
Isto é muito bem explicado na documentação do Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane
TLDR não anotado: confirmação; anotada: cometer, autor, data, (opcional) Comentário
Antony Hatchkins

Respostas:

255

TL; DR

A diferença entre os comandos é que um fornece uma mensagem de marca, enquanto o outro não. Uma tag anotada possui uma mensagem que pode ser exibida com git-show (1), enquanto uma tag sem anotações é apenas um ponteiro nomeado para uma confirmação.

Mais sobre tags leves

De acordo com a documentação : "Para criar uma marca leve, não forneça nenhuma das opções -a, -s ou -m, apenas forneça um nome de marca". Existem também algumas opções diferentes para escrever uma mensagem em tags anotadas:

  • Quando você usa git tag <tagname>, o Git cria uma tag na revisão atual, mas não solicita uma anotação. Será marcado sem uma mensagem (esta é uma marca leve).
  • Quando você usa git tag -a <tagname>, o Git solicita uma anotação, a menos que você também tenha usado o sinalizador -m para fornecer uma mensagem.
  • Quando você usa git tag -a -m <msg> <tagname>, o Git marca o commit e o anota com a mensagem fornecida.
  • Quando você usa git tag -m <msg> <tagname>, o Git se comporta como se você passasse o sinalizador -a para anotação e usasse a mensagem fornecida.

Basicamente, é apenas se você deseja que a tag tenha uma anotação e algumas outras informações associadas a ela ou não.

Todd A. Jacobs
fonte
4
Existe uma diferença entre uma tag "anotação" e uma mensagem de confirmação?
21311 Steve Bennett
3
@SteveBennett Sim. Uma anotação de tag não é uma mensagem de confirmação. Você não pode vê-lo com git-log (1); você precisa usar o git-show (1).
27612 Todd A. Jacobs
115
A diferença entre as tags "anotadas" e "leves" vai além da mensagem. Você pode ter uma tag anotada sem uma mensagem ( git tag -a <tag> -m ''), mas uma tag anotada sempre possui tagger (autor) e data .
Piotr Findeisen 24/10
1
O mesmo para mim. As tags de versão geralmente têm mensagens bastante inúteis (pode dizer mais do que o nome? Para quê?). Infelizmente, esta resposta mais votada não menciona essa diferença.
Piotr Findeisen
44
Outra coisa importante a ser observada é que, quando você envia suas tags para um repositório remoto git push --follow-tags, somente as tags anotadas serão enviadas.
Xatoo
209

Empurre tags anotadas, mantenha local leve

man git-tag diz:

Tags anotadas destinam-se à liberação, enquanto tags leves destinam-se a rótulos de objetos particulares ou temporários.

E certos comportamentos se diferenciam entre si de maneiras que essa recomendação é útil, por exemplo:

  • as tags anotadas podem conter uma mensagem, criador e data diferentes da confirmação para a qual apontam. Portanto, você pode usá-los para descrever um release sem fazer um commit de lançamento.

    Tags leves não possuem essas informações extras e não precisam delas, pois você as usará apenas para desenvolver.

  • git push --follow-tags apenas enviará tags anotadas
  • git describe sem opções de linha de comando vê apenas tags anotadas

Diferenças internas

  • as tags leve e anotada são um arquivo .git/refs/tagsque contém um SHA-1

  • para tags leves, o SHA-1 aponta diretamente para uma confirmação:

    git tag light
    cat .git/refs/tags/light
    

    imprime da mesma forma que o SHA-1 da HEAD.

    Portanto, não admira que eles não possam conter outros metadados.

  • tags anotadas apontam para um objeto de tag no banco de dados de objetos.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    contém o SHA do objeto de tag anotado:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    e então podemos obter seu conteúdo com:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    saída de amostra:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    E é assim que ele contém metadados extras. Como podemos ver na saída, os campos de metadados são:

    Uma análise mais detalhada do formato está presente em: Qual é o formato de um objeto de tag git e como calcular seu SHA?

Bónus

  • Determine se uma tag está anotada:

    git cat-file -t tag
    

    Saídas

    • commit para leve, como não há objeto de tag, ele aponta diretamente para o commit
    • tag anotado, uma vez que existe um objeto de tag nesse caso
  • Listar apenas tags leves: como posso listar todas as tags leves?

Ciro Santilli adicionou uma nova foto
fonte
1
Isso é muito mais claro que a resposta atualmente aceita. Obrigado.
Reece
43

A grande diferença é perfeitamente explicada aqui .

Basicamente, tags leves são apenas indicadores de confirmações específicas. Nenhuma informação adicional é salva ; por outro lado, as tags anotadas são objetos regulares , que possuem um autor e uma data e podem ser consultadas porque possuem sua própria chave SHA.

Se souber quem marcou o quê e quando é relevante para você, use tags anotadas. Se você deseja marcar um ponto específico no seu desenvolvimento , não importa quem e quando fez isso, as tags leves são boas o suficiente.

Normalmente, você deve usar tags anotadas, mas isso depende do mestre do Git do projeto.

Luis
fonte