Если я хочу пометить текущий коммит. Я знаю, что обе следующие командные строки работают:
git tag <tagname>
и
git tag -a <tagname> -m '<message>'
В чем разница между этими командами?
Если я хочу пометить текущий коммит. Я знаю, что обе следующие командные строки работают:
git tag <tagname>
и
git tag -a <tagname> -m '<message>'
В чем разница между этими командами?
Ответы:
Разница между командами заключается в том, что одна выдает вам сообщение тега, а другая - нет. У аннотированного тега есть сообщение, которое можно отобразить с помощью 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 для аннотации и используете предоставленное сообщение.По сути, это просто означает, хотите ли вы, чтобы у тега была аннотация и некоторая другая информация, связанная с ним, или нет.
git tag -a <tag> -m ''
), но у аннотированного тега всегда есть тег (автор) и дата .
git push --follow-tags
только аннотированные теги.
Нажимайте аннотированные метки, сохраняйте вес локальным
man git-tag
говорит:
Аннотированные теги предназначены для выпуска, в то время как легкие теги предназначены для меток частных или временных объектов.
И некоторые виды поведения делают различие между ними таким образом, что эта рекомендация полезна, например:
аннотированные теги могут содержать сообщение, создателя и дату, отличную от фиксации, на которую они указывают. Таким образом, вы можете использовать их для описания релиза, не делая релиз релиза.
Легкие теги не имеют такой дополнительной информации и не нуждаются в ней, так как вы будете использовать ее только для разработки.
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
для аннотированных, так как в этом случае есть объект тегаСписок только легких тегов: Как я могу перечислить все легкие теги?
Большая разница прекрасно объяснено здесь .
По сути, легкие теги являются просто указателями на конкретные коммиты. Дальнейшая информация не сохраняется ; с другой стороны, аннотированные теги являются обычными объектами , которые имеют автора и дату, и на них можно ссылаться, поскольку они имеют свой собственный ключ SHA.
Если вы знаете, кто пометил, что и когда для вас актуально, используйте аннотированные теги. если ты просто хотите пометить конкретную точку в своем развитии , независимо от того, кто и когда это сделал, тогда легкие теги достаточно хороши.
Обычно вы бы использовали аннотированные теги, но это действительно зависит от мастера Git проекта.