В чем разница между аннотированным и неаннотированным тегом?
Если я хочу пометить текущую фиксацию. Я знаю, что работают обе следующие командные строки:
git tag <tagname>
и
git tag -a <tagname> -m '<message>'
В чем разница между этими командами?
Ответы
Ответ 1
TL; DR
Разница между командами заключается в том, что одна выдает вам сообщение тега, а другая - нет. У аннотированного тега есть сообщение, которое можно отобразить с помощью git -s how (1), в то время как тег без аннотаций является просто именованным указателем на коммит.
Подробнее о легких тегах
Согласно документации: "Для создания облегченного тега не указывайте ни один из параметров -a, -s или -m, просто укажите имя тега". Есть также несколько различных вариантов написания сообщения в аннотированных тегах:
- Когда вы используете
git tag <tagname>
, Git создаст тег в текущей редакции, но не будет запрашивать аннотацию. Он будет помечен без сообщения (это облегченный тег). - Когда вы используете
git tag -a <tagname>
, Git git tag -a <tagname>
вас аннотацию, если вы не использовали флаг -m для предоставления сообщения. - Когда вы используете
git tag -a -m <msg> <tagname>
, Git помечает коммит и комментирует его предоставленным сообщением. - Когда вы используете
git tag -m <msg> <tagname>
, Git будет вести себя так, как будто вы передали флаг -a для аннотации и используете предоставленное сообщение.
По сути, это просто означает, хотите ли вы, чтобы у тега была аннотация и некоторая другая информация, связанная с ним, или нет.
Ответ 2
Нажмите аннотированные метки, сохраняйте вес локальным
man git-tag
говорит:
Аннотированные теги предназначены для выпуска, в то время как легкие теги предназначены для меток частных или временных объектов.
И некоторые виды поведения делают различие между ними таким образом, что эта рекомендация полезна, например:
-
аннотированные теги могут содержать сообщение, создателя и дату, отличную от фиксации, на которую они указывают. Таким образом, вы можете использовать их для описания релиза, не делая релиз релиза.
Облегченные теги не имеют такой дополнительной информации и не нуждаются в ней, поскольку вы будете использовать ее только для разработки.
- git push --follow-tags будет толкать только аннотированные теги
-
git describe
без параметров командной строки видит только аннотированные теги
Внутренние различия
-
Облегченные и аннотированные теги представляют собой файл в каталоге .git/refs/tags
, содержащий SHA-1.
-
для легких тегов SHA-1 указывает непосредственно на коммит:
git tag light
cat .git/refs/tags/light
печатает так же, как HEAD SHA-1.
Поэтому неудивительно, что они не могут содержать никаких других метаданных.
-
аннотированные теги указывают на объект тега в базе данных объекта.
git tag -as -m msg annot
cat .git/refs/tags/annot
содержит SHA аннотированного тегового объекта:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
и тогда мы можем получить его содержимое с:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
образец вывода:
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
И вот как он содержит дополнительные метаданные. Как видно из вывода, поля метаданных:
Более подробный анализ формата представлен на: Что такое формат объекта тега git и как рассчитать его SHA?
Бонусы
-
Определите, является ли тег аннотированным:
git cat-file -t tag
Выходы
-
commit
для облегченного, так как нет объекта тега, он указывает непосредственно на коммит -
tag
для аннотированного, так как в этом случае есть объект тега
-
Список только легких тегов: Как я могу перечислить все легкие теги?
Ответ 3
Разница большая прекрасно объясняется здесь.
В основном, легкие теги являются лишь указателями на конкретные коммиты. Дополнительная информация не сохраняется; с другой стороны, аннотированные теги являются регулярными объектами, у которых есть автор и дата, и их можно передать, поскольку они имеют свой собственный ключ SHA.
Если вы знаете кто с тегом , что и , когда, используйте аннотированные теги. Если вы просто хотите пометить определенную точку в своей разработке, независимо от того, кто и когда сделал это, то легкие теги будут достаточно хорошими.
Обычно вы должны использовать аннотированные теги, но это действительно зависит от мастера Git проекта.