В чем разница между аннотированным и неаннотированным тегом?

Если я хочу пометить текущую фиксацию. Я знаю, что работают обе следующие командные строки:

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 проекта.