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?
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?
Respostas:
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.
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:
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).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.git tag -a -m <msg> <tagname>
, o Git marca o commit e o anota com a mensagem fornecida.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.
git tag -a <tag> -m ''
), mas uma tag anotada sempre possui tagger (autor) e data .
git push --follow-tags
, somente as tags anotadas serão enviadas.
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 describe
sem opções de linha de comando vê apenas tags anotadasDiferenças internas
as tags leve e anotada são um arquivo .git/refs/tags
que 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 <your@mail.com> 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 committag
anotado, uma vez que existe um objeto de tag nesse casoListar apenas tags leves: como posso listar todas as tags leves?
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.