Теги Git применяются только к текущей ветке?
В настоящее время я работаю с репозиторием с несколькими ветвями.
Когда я создаю тег, этот тег ссылается на текущую ветвь?
Другими словами: всякий раз, когда я создаю тег, мне нужно переключиться на нужную ветку и тег внутри этой ветки, чтобы тег ссылался на эту ветвь в этот момент времени?
Ответы
Ответ 1
Если вы создаете тег, например,
git tag v1.0
тег будет ссылаться на самую последнюю фиксацию ветки, в которой вы сейчас находитесь. Вы можете изменить ветку и создать там тег.
Вы также можете просто ссылаться на другую ветку при пометке,
git tag v1.0 name_of_other_branch
который создаст тег для последнего фиксации другой ветки.
Или вы можете просто поместить тег в любом месте, независимо от того, какую ветвь, непосредственно ссылаясь на SHA1 некоторой фиксации
git tag v1.0 <sha1>
Ответ 2
ответ CharlesB и helmbert answer полезны, но мне потребовалось некоторое время, чтобы понять их.
Вот еще один способ:
- Тег - это указатель на фиксацию, а фиксируется независимо от ветвей.
- Важно понимать, что теги не имеют прямой связи с ветвями - они только идентифицируют фиксацию.
- Это фиксация может указывать на любое количество ветвей - т.е. она может быть частью истории любого количества ветвей - в том числе и никого.
- Таким образом, при запуске
git show <tag>
для просмотра сведений о теге не содержится ссылок на какие-либо ветки, только идентификатор фиксации, на который указывает тэг.
- (Commit IDs (имена объектов a.k.a. или идентификаторы SHA-1) представляют собой 40-символьные строки, состоящие из шестнадцатеричных цифр, которые являются хешами над содержимым фиксации, например:
6f6b5997506d48fc6267b0b60c3f0261b6afe7a2
)
- Филиалы вступают в игру только косвенно:
- Во время создания тега, , подразумевая фиксацию, что тег будет указывать на:
- Не указывая цель для тега по умолчанию для текущей последней ветки последней ветки (a.k.a. HEAD); например.:
-
git tag v0.1.0 # tags HEAD of *current* branch
- Указание имени ветки как целевого объекта тега по умолчанию для последней ветки последней ветки; например.:
-
git tag v0.1.0 develop # tags HEAD of 'develop' branch
- (Как отмечали другие, вы также можете указать идентификатор commit явно как цель тега.)
- При использовании
git describe
для описания текущей ветки:
-
git describe [--tags]
описывает текущую ветвь в терминах коммитов с самого последнего (возможно, легкого) тега в этой истории ветвей.
- Таким образом, тег, на который ссылается
git describe
, может НЕ отражать последний созданный тег в целом.
Ответ 3
Теги и ветвь полностью не связаны друг с другом, так как теги ссылаются на конкретную фиксацию, а ветвь - движущаяся ссылка на последнюю фиксацию истории. Филиалы идут, теги остаются.
Поэтому, когда вы отмечаете фиксацию, git не заботится о том, какая фиксация или ветвь выгружена, если вы предоставите ему SHA1 того, что вы хотите пометить.
Я могу даже пометить, обратившись к ветке (она пометит кончик ветки), а затем скажет, что кончик ветки находится в другом месте (например, git reset --hard
) или удаляет ветвь. Однако тег, который я создал, не будет перемещаться.
Ответ 4
При вызове только git tag <TAGNAME>
без каких-либо дополнительных параметров Git создаст новый тег из текущего HEAD (т.е. HEAD вашей текущей ветки). При добавлении дополнительных коммитов в эту ветку ветвь HEAD будет поддерживать эти новые коммиты, в то время как тег всегда ссылается на одну и ту же фиксацию.
При вызове git tag <TAGNAME> <COMMIT>
вы даже можете указать, какую фиксацию использовать для создания тега.
Несмотря на это, тег по-прежнему просто "указатель" на определенную фиксацию (а не ветку).
Ответ 5
Мы можем создать тег для некоторого прошлого commit:
git tag tag_name ссылка commit
например: git тег v1.0 5fcdb03