Применяются ли теги Git только к текущей ветке?


157

В настоящее время я работаю с хранилищем, которое имеет несколько веток.

Когда я создаю тег, относится ли этот тег к текущей ветви?

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

Ответы:


152

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

git tag v1.0

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

Вы также можете просто ссылаться на другую ветку во время пометки,

git tag v1.0 name_of_other_branch

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

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

git tag v1.0 <sha1>

202

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

  • Тег является указателем на фиксации , и существуют фиксации независимо от ветвей .
    • Важно понимать, что теги не имеют прямой связи с ветками - они только идентифицируют коммит .
      • На этот коммит можно указывать из любого числа ветвей, т. Е. Он может быть частью истории любого количества ветвей, в том числе ни одной.
    • Следовательно, git show <tag>при просмотре сведений о теге не содержится ссылок на какие-либо ветви, только идентификатор фиксации, на которую указывает тег.
      • (Commit идентификаторов (AKA имен объектов или SHA-1 идентификаторы) являются строки 40-символов состоят из шестнадцатеричных цифр, которые хэш над содержимым коммят, например:. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Филиалы вступают в игру только косвенно :
    • На момент создания тега , по подразумевающей фиксации , что тег будет указывать на :
      • Не указывается цель для тега, по умолчанию используется самая последняя фиксация текущей ветви (или HEAD); например:
        • 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может НЕ отражать последний созданный тег в целом .

Итак, для данного тега (например, v0.1.0), чтобы знать, какой фактический источник находится в фактической сборке (этого источника), вам действительно нужно знать ветку, на которой была построена сборка, верно? Т.е. у данного коммита могут быть разные потомки в разных ветках, верно?
Соколиный Глаз Паркер

2
@HawkeyeParker: я больше не погружен в это, но вам не нужно знать ветку, потому что тег идентифицирует конкретный коммит (который может быть частью нескольких ветвей), и вы можете исследовать его.
mklement0

Но если я сделаю git show [tagname], то он отобразит имя ветки выше Author и Date, что противоречит тому, что «git show <tag> показывает, что подробности тега не содержат ссылок на какие-либо ветви»
Брэд Томас,

39

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

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

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


17
Другими словами, теги - это просто хорошие названия для мерзких мерзавцев. Тег (и хеш) существует независимо от того, какие ветви существуют (ред.).
C-Otto

8

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

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

В любом случае, тег все еще является просто «указателем» на определенный коммит (не ветвь).


6

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

git tag [tag_name] [reference_of_commit]

например:

git tag v1.0 5fcdb03

1

Если вы хотите пометить ветку, в которой находитесь, введите:

git tag <tag>

и нажмите на ветку с помощью:

git push origin --tags

0

Если вы хотите создать тег из ветви, которая будет выглядеть примерно так, то release/yourbranchвам нужно использовать что-то вроде

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

После создания правильного тега, если вы хотите перенести его на удаленный пункт, используйте команду

git push origin YOUR_TAG_VERSION_OR_NAME
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.