As tags Git se aplicam apenas à ramificação atual?

156

Atualmente, estou trabalhando com um repositório que possui várias ramificações.

Quando crio uma tag, essa tag se refere ao ramo então atual?

Em outras palavras: sempre que crio uma marca, preciso mudar para o ramo desejado e marcar dentro desse ramo para que a marca se refira àquele ramo naquele momento?

Gerardo
fonte

Respostas:

151

Se você criar uma tag por exemplo

git tag v1.0

a tag se refere ao commit mais recente da filial em que você está atualmente. Você pode alterar a ramificação e criar uma tag lá.

Você também pode se referir à outra ramificação ao marcar,

git tag v1.0 name_of_other_branch

que criará a tag para o commit mais recente do outro ramo.

Ou você pode simplesmente colocar a tag em qualquer lugar, independentemente da ramificação, referenciando diretamente o SHA1 de alguns commit

git tag v1.0 <sha1>
Kalle Pokki
fonte
201

A resposta de CharlesB e a de Helmbert são úteis, mas levei um tempo para entendê-las. Aqui está outra maneira de colocá-lo:

  • Uma tag é um ponteiro para uma confirmação e as confirmações existem independentemente das ramificações .
    • É importante entender que as tags não têm relação direta com as ramificações - elas apenas identificam uma confirmação .
      • Esse commit pode ser apontado a partir de qualquer número de ramificações - ou seja, pode fazer parte do histórico de qualquer número de ramificações - incluindo nenhuma.
    • Portanto, a execução git show <tag>para ver os detalhes de uma marca não contém referência a nenhuma ramificação, apenas o ID da confirmação que a marca aponta.
      • (Os IDs de confirmação (também conhecidos como nomes de objeto ou IDs SHA-1) são seqüências de 40 caracteres compostas por dígitos hexadecimais que são hashes sobre o conteúdo de uma confirmação; por exemplo 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2:)
  • Os ramos entram em ação apenas indiretamente :
    • No momento da criação de uma tag , implicando o commit que a tag apontará :
      • Não especificar um destino para uma marca padrão para o commit mais recente do ramo atual (também conhecido como HEAD); por exemplo:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • A especificação de um nome de filial como padrão de destino da marca para a confirmação mais recente dessa filial; por exemplo:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Como outros observaram, você também pode especificar um ID de confirmação explicitamente como o destino da tag.)
    • Ao usar git describepara descrever a ramificação atual:
      • git describe [--tags] descreve o ramo atual em termos de confirmações desde a tag [possivelmente leve] mais recente no histórico desse ramo .
      • Portanto, a tag referenciada por git describeNÃO pode refletir a tag criada mais recentemente em geral .
mklement0
fonte
Portanto, para uma determinada tag (por exemplo, v0.1.0), para saber qual fonte real está em uma compilação real (dessa fonte), você realmente precisa conhecer o ramo em que a compilação foi baseada, certo? Ou seja, um determinado commit pode ter descendentes diferentes em ramos diferentes, certo?
Hawkeye Parker
2
@HawkeyeParker: Eu não estou mais imerso nisso, mas você não precisa conhecer o ramo, porque uma tag identifica um commit específico (que pode fazer parte de vários ramos), e você pode investigar a partir daí.
usar o seguinte comando
Mas se eu fizer show de git [tagname], em seguida, ele mostra um nome galho acima Autor e Data, o que contradiz "correndo git show de <tag> para ver os detalhes de um tag não contém nenhuma referência a quaisquer ramos"
Brad Thomas
39

Tags e ramificações não são completamente relacionadas, pois as tags se referem a um commit específico, e o branch é uma referência em movimento ao último commit de um histórico. Os ramos vão, as etiquetas ficam.

Portanto, quando você marca um commit, o git não se importa com o commit ou o ramo que está marcado, se você fornecer a ele o SHA1 do que você deseja marcar.

Eu posso até marcar consultando um ramo (ele marcará a ponta do ramo) e depois digo que a dica do ramo está em outro lugar ( git reset --hardpor exemplo) ou exclua o ramo. A tag que eu criei, no entanto, não será movida.

CharlesB
fonte
17
Em outras palavras, tags são apenas bons nomes para os feios hash git. A tag (e o hash) existe, independentemente de quais ramificações existam (ed).
C-Otto
8

Ao chamar apenas git tag <TAGNAME>sem parâmetros adicionais, o Git criará uma nova tag a partir do seu HEAD atual (ou seja, o HEAD do seu ramo atual). Ao adicionar confirmações adicionais a este ramo, o ramo HEAD acompanhará esses novos comprometimentos, enquanto a tag sempre se refere ao mesmo commit.

Ao ligar, git tag <TAGNAME> <COMMIT>você pode até especificar qual confirmação usar para criar a tag.

Independentemente disso, uma tag ainda é simplesmente um "ponteiro" para um determinado commit (não um branch).

Helmbert
fonte
6

Podemos criar uma tag para alguns commit anteriores:

git tag [tag_name] [reference_of_commit]

por exemplo:

git tag v1.0 5fcdb03
Sana Hameed
fonte
1

Se você quiser marcar o ramo em que está, digite:

git tag <tag>

e empurre o ramo com:

git push origin --tags
Mutatos
fonte
0

Se você deseja criar uma tag a partir de um ramo que é algo como release/yourbranchetc, então você deve usar algo como

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Após criar a tag adequada, se você deseja enviar a tag para remoto, use o comando

git push origin YOUR_TAG_VERSION_OR_NAME
BharathRao
fonte