Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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