Яка різниця між тегом, що позначається, та зазначається без примітки?


332

Якщо я хочу помітити тег на поточний фіксатор. Я знаю, що працюють обидва наступні командні рядки:

git tag <tagname>

і

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

Яка різниця між цими командами?



1
@Thilo Це не точний дублікат. Посилається на запитання про те, коли потрібно коментувати, а не про відповідні прапори.
Тодд А. Джейкобс

1
Це дуже добре пояснено в документації Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane

TLDR не помічено: виконувати; анотація: фіксація, автор, дата, (необов’язково) коментар
Ентоні Хеткінс

Відповіді:


254

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
Те саме для мене. Теги версій зазвичай містять досить марні повідомлення (чи можна сказати більше, ніж ім’я? Для чого?). На жаль, ця відповідь, що голосує на виборах, не відзначає цієї різниці.
Piotr Findeisen

44
Ще одна важлива річ, яку потрібно відзначити, це те, що при натисканні тегів до віддаленого сховища використовуються git push --follow-tagsлише теги з примітками, що коментуються.
Хатуа

209

Надішліть мітки з примітками, зберігайте легкі місцеві

man git-tag каже:

Помічені теги призначені для випуску, тоді як легкі теги призначені для приватних або тимчасових міток об'єктів.

І певна поведінка відрізняється між собою так, як ця рекомендація корисна, наприклад:

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

    Легкі теги не мають такої додаткової інформації і не потребують її, оскільки ви її збираєтеся використовувати лише для розробки.

  • git push - наступні теги натискатимуть лише помічені теги
  • git describe без параметрів командного рядка відображаються лише помічені теги

Внутрішні відмінності

  • і легкі, і помічені теги - це файл, .git/refs/tagsщо містить SHA-1

  • Щодо легких тегів, SHA-1 вказує безпосередньо на комісію:

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

    друкує те саме, що і SHA-1 HEAD.

    Тож недарма вони не можуть містити жодних інших метаданих.

  • анотовані теги вказують на об’єкт тегів у базі даних об’єктів.

    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 tag і як обчислити його SHA?

Бонуси

  • Визначте, чи тег помічено:

    git cat-file -t tag
    

    Виходи

    • commit для легкої ваги, оскільки немає тего-об'єкта, він вказує безпосередньо на коміт
    • tag для примітки, оскільки в цьому випадку є об'єкт тегу
  • Список лише легких тегів: Як я можу перерахувати всі полегшені теги?


1
Це набагато зрозуміліше, ніж прийнята зараз відповідь. Дякую.
Різ

43

Велика різниця прекрасно пояснено тут .

По суті, легкі теги - це лише вказівки на конкретні коміти. Більше ніякої інформації не зберігається ; з іншого боку, помічені теги - це звичайні об'єкти , у яких є автор та дата, і їх можна пересилати, оскільки вони мають власний ключ SHA.

Якщо ви знаєте, хто позначив те, що і коли стосується вас, тоді використовуйте мітки з примітками. Якщо ви просто хочете позначити конкретний момент у вашій розробці , незалежно від того, хто і коли це зробив, то легкі теги є досить хорошими.

Зазвичай ви б хотіли шукати помічені теги, але це справді залежить від майстра проекту Git.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.