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

Se eu quiser marcar o commit atual. Eu sei que ambas as seguintes linhas de comando funcionam:

git tag  

e

 git tag -a  -m '' 

Qual a diferença entre esses comandos?

TL; DR

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

Mais sobre tags leves

A menos que você selecione o sinalizador -s para uma tag assinada, a tag será uma tag leve e não assinada por padrão. Existem também algumas diferenças com tags leves:

  • Quando você usa o git tag , o Git criará uma tag na revisão atual, mas não solicitará uma anotação. Será marcado sem uma mensagem.
  • Quando você usa a git tag -a , o Git solicitará uma anotação, a menos que você também tenha usado o sinalizador -m para fornecer uma mensagem.
  • Quando você usa a git tag -a -m , o Git marcará o commit e anotará com a mensagem fornecida.
  • Quando você usa a git tag -m , o Git se comportará como se você tivesse passado o sinalizador -a para anotação e usasse a mensagem fornecida.

Basicamente, significa apenas se você quer que a tag lightweight tenha uma anotação associada ou não.

Diferenças de uso

man git-tag diz:

As tags anotadas são destinadas à liberação, enquanto as tags leves são destinadas a labels de objects particulares ou temporários.

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

  • tags anotadas podem conter uma mensagem, um criador e uma data diferentes do commit para o qual eles apontam. Então você poderia usá-los para descrever uma versão sem fazer um commit de release.

    As tags leves não têm essa informação extra e não precisam disso, já que você só vai usá-la para se desenvolver.

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

Diferenças internas

  • as tags leves e anotadas são um arquivo em .git/refs/tags que contém um SHA-1

  • para tags leves, o SHA-1 aponta diretamente para um commit:

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

    imprime o mesmo que o SHA-1 da CABEÇA.

    Portanto, não é de admirar que eles não possam conter nenhum outro metadado.

  • Tags anotadas apontam para um object de tag no database de objects.

     $ git tag -as -m msg annot $ git cat-file -t "$(cat .git/refs/tags/annot)" tag $ # Get a textual representation of the tag object. $ git cat-file -p "$(cat .git/refs/tags/annot)" object 4284c41353e51a07e4ed4192ad2e9eaada9c059f type commit tag annot tagger Ciro Santilli  1411478848 +0200 msg -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux)  -----END PGP SIGNAT 

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

    • o object para o qual aponta
    • o tipo de object para o qual ele aponta. Sim, os objects de tags podem apontar para qualquer outro tipo de object, como blobs, não apenas commits .
    • o nome da tag
    • identidade do marcador e data e hora
    • mensagem. Observe como a assinatura PGP é apenas anexada à mensagem

Bônus

  • Determine se uma tag é anotada:

     git cat-file -t tag 

    Saídas commit para leve, tag para anotado.

  • Listar somente tags leves: como posso listar todas as tags leves?

A grande diferença é perfeitamente explicada aqui .

Basicamente, tags leves são apenas apontadores para commits específicos. Nenhuma informação adicional é salva ; Por outro lado, as tags anotadas são objects regulares , que têm um autor e uma data e podem ser encaminhados porque têm sua própria chave SHA.

Se souber quem marcou o que e quando é relevante para você, use tags anotadas. Se você quiser apenas 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ê escolheria as tags anotadas, mas cabe ao mestre do Git do projeto.