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

333

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

git tag <tagname>

и

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

В чем разница между этими командами?

user462301
источник
1
@Thilo Это не точный дубликат. Упомянутый вопрос касается того, когда нужно комментировать, а не о связанных флагах.
Тодд А. Джейкобс
1
Это очень хорошо объяснено в документации Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane
TLDR без аннотации: зафиксировать; аннотированный: коммит, автор, дата, (необязательно) комментарий
Энтони Хэтчкинс

Ответы:

255

TL; DR

Разница между командами заключается в том, что одна выдает вам сообщение тега, а другая - нет. У аннотированного тега есть сообщение, которое можно отобразить с помощью git-show (1), в то время как тег без аннотаций является просто именованным указателем на коммит.

Подробнее о легких тегах

Согласно документации : «Чтобы создать легкий тег, не указывайте ни один из параметров -a, -s или -m, просто укажите имя тега». Есть также несколько вариантов написания сообщения для аннотированных тегов:

  • Когда вы используете git tag <tagname>, Git создаст тег в текущей ревизии, но не будет запрашивать аннотацию. Он будет помечен без сообщения (это облегченный тег).
  • Когда вы используете git tag -a <tagname>, Git предложит вам аннотацию, если вы не использовали флаг -m для предоставления сообщения.
  • Когда вы используете git tag -a -m <msg> <tagname>, Git помечает коммит и аннотирует его предоставленным сообщением.
  • Когда вы используете git tag -m <msg> <tagname>, Git будет вести себя так, как будто вы передали флаг -a для аннотации и используете предоставленное сообщение.

По сути, это просто означает, хотите ли вы, чтобы у тега была аннотация и некоторая другая информация, связанная с ним, или нет.

Тодд А. Джейкобс
источник
4
Есть ли разница между тегом «аннотация» и сообщением о коммите?
Стив Беннетт
3
@SteveBennett Да. Аннотация тега не является сообщением фиксации. Вы не можете увидеть это с помощью git-log (1); вам нужно использовать git-show (1).
Тодд А. Джейкобс
115
Разница между «аннотированными» и «легкими» тегами выходит за рамки сообщения. Вы можете иметь аннотированный тег без сообщения ( git tag -a <tag> -m ''), но у аннотированного тега всегда есть тег (автор) и дата .
Петр Финдейзен
1
Мне то же. Теги версий обычно содержат довольно бесполезные сообщения (может ли оно сказать больше, чем название? Зачем?). К сожалению, этот голосующий голос не упоминает эту разницу.
Петр Финдейзен
44
Еще одна важная вещь, которую стоит отметить, это то, что когда вы перемещаете свои теги в удаленное хранилище, используя git push --follow-tagsтолько аннотированные теги.
Xatoo
209

Нажимайте аннотированные метки, сохраняйте вес локальным

man git-tag говорит:

Аннотированные теги предназначены для выпуска, в то время как легкие теги предназначены для меток частных или временных объектов.

И некоторые виды поведения делают различие между ними таким образом, что эта рекомендация полезна, например:

  • аннотированные теги могут содержать сообщение, создателя и дату, отличную от фиксации, на которую они указывают. Таким образом, вы можете использовать их для описания релиза, не делая релиз релиза.

    Легкие теги не имеют такой дополнительной информации и не нуждаются в ней, так как вы будете использовать ее только для разработки.

  • git push --follow-tags будет толкать только аннотированные теги
  • git describe без параметров командной строки видит только аннотированные теги

Внутренние различия

  • и легкие, и аннотированные теги представляют собой файл, в .git/refs/tagsкотором содержится SHA-1

  • для легких тегов SHA-1 указывает непосредственно на коммит:

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

    печатает так же, как 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 <your@mail.com> 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 для аннотированных, так как в этом случае есть объект тега
  • Список только легких тегов: Как я могу перечислить все легкие теги?

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
1
Это намного понятнее, чем принятый в настоящее время ответ. Спасибо.
Рис
43

Большая разница прекрасно объяснено здесь .

По сути, легкие теги являются просто указателями на конкретные коммиты. Дальнейшая информация не сохраняется ; с другой стороны, аннотированные теги являются обычными объектами , которые имеют автора и дату, и на них можно ссылаться, поскольку они имеют свой собственный ключ SHA.

Если вы знаете, кто пометил, что и когда для вас актуально, используйте аннотированные теги. если ты просто хотите пометить конкретную точку в своем развитии , независимо от того, кто и когда это сделал, тогда легкие теги достаточно хороши.

Обычно вы бы использовали аннотированные теги, но это действительно зависит от мастера Git проекта.

Луис
источник