Теги ГИТ применяются только к текущей ветке?


в настоящее время я работаю с репозиторием, который имеет несколько ветвей.

когда я создаю тег, этот тег ссылается на тогдашнюю ветвь?

другими словами: всякий раз, когда я создаю тег, мне нужно переключиться на нужную ветвь и тег внутри этой ветви, чтобы тег ссылался на эту ветвь в этот момент времени?

5 89

5 ответов:

Если вы создаете тег, например,

git tag v1.0

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

вы также можете просто обратиться к другой ветви, помечая,

git tag v1.0 name_of_other_branch

создать тэг для последнего коммита другой ветке.

или вы можете просто поместить тег в любом месте, независимо от того, какая ветвь, напрямую ссылаясь на SHA1 некоторых совершение

git tag v1.0 <sha1>

ответ Чарльза и ответ хельмберта и полезны, но мне потребовалось время, чтобы понять их. Вот еще один способ выразить это:

  • A tag это указатель на коммит и коммиты существуют независимо от ветвей.
    • важно понимать, что теги нет прямые связь с филиалами - они только когда-либо определить commit.
      • на эту фиксацию можно указать из любого числа ветвей, т. е. она может быть частью истории любого числа ветвей, включая ни одну.
    • таким образом, под управлением git show <tag> чтобы увидеть детали тега, не содержит ссылки на какие-либо ветви, только идентификатор фиксации, на которую указывает тег.
      • (фиксация идентификаторов (это.к.а. имена объектов или SHA-1 ids) являются 40-символьных строк, состоящий из шестигранной. цифры, которые являются хэшами над содержимым фиксации; например:6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • ветви вступают в игру только косвенно:
    • во время создания тег, by подразумевая совершения что тег будет указывать:
      • не указывая цель для тега по умолчанию для текущей ветви наиболее последние фиксации (а.к.а. Руководителя); например,:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • указание имени ветви в качестве целевого тега по умолчанию для последней фиксации этой ветви; например:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (как отмечали другие, вы также можете явно указать идентификатор фиксации в качестве цели тега.)
    • при использовании git describe для описания текущей ветви:
      • git describe [--tags] описывает текущую ветвь с точки зрения коммитов с самого последнего [возможно, легкого] тега в истории этой отрасли.
      • таким образом, тег, на который ссылается git describe может не отражать последний созданный тег в целом.

теги и ветвь совершенно не связаны, так как теги ссылаются на конкретную фиксацию, а ветвь-это движущаяся ссылка на последнюю фиксацию истории. Ветки идут, метки остаются.

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

Я даже могу пометить, ссылаясь на ветку (затем он пометит кончик ветки), а позже скажет, что кончик ветки находится в другом месте (с git reset --hard например), или удалить ветку. Тег, который я создал, однако не будет двигаться.

при вызове просто git tag <TAGNAME> без каких-либо дополнительных параметров Git создаст новый тег из вашей текущей головы (т. е. головы вашей текущей ветви). При добавлении дополнительных коммитов в эту ветвь глава ветви будет идти в ногу с этими новыми коммитами, в то время как тег всегда ссылается на один и тот же коммит.

при вызове git tag <TAGNAME> <COMMIT> вы даже можете указать, какой коммит использовать для создания тега.

несмотря на это, тег по-прежнему является просто "указателем" на определенную фиксацию (не филиала).

мы можем создать тег для некоторых последних фиксации:

git tag tag_name ссылка на commit

например: git tag v1. 0 5fcdb03