I tag Git si applicano solo al ramo corrente?


157

Attualmente sto lavorando con un repository con più rami.

Quando creo un tag, quel tag si riferisce al ramo allora attuale?

In altre parole: ogni volta che creo un tag, devo passare al ramo desiderato e tag all'interno di quel ramo in modo che il tag faccia riferimento a quel ramo in quel momento?

Risposte:


152

Se si crea un tag ad es

git tag v1.0

il tag farà riferimento al commit più recente del ramo in cui ci si trova attualmente. Puoi cambiare ramo e creare un tag lì.

Puoi anche fare riferimento all'altro ramo mentre tagghi,

git tag v1.0 name_of_other_branch

che creerà il tag per il commit più recente dell'altro ramo.

Oppure puoi semplicemente posizionare il tag ovunque, indipendentemente dal ramo, facendo riferimento direttamente allo SHA1 di alcuni commit

git tag v1.0 <sha1>

202

La risposta di Charles B e la risposta di Helmbert sono entrambe utili, ma mi ci è voluto un po 'di tempo per capirle. Ecco un altro modo di dirlo:

  • Un tag è un puntatore a un commit e i commit esistono indipendentemente dai rami .
    • È importante capire che i tag non hanno una relazione diretta con i rami : identificano sempre e solo un commit .
      • Tale commit può essere indicato da qualsiasi numero di filiali, ovvero può far parte della cronologia di qualsiasi numero di filiali, inclusa nessuna.
    • Pertanto, l'esecuzione git show <tag>per visualizzare i dettagli di un tag non contiene alcun riferimento ad alcun ramo, ma solo l'ID del commit a cui punta il tag.
      • (Gli ID di commit (noti anche come nomi di oggetti o ID SHA-1) sono stringhe di 40 caratteri composte da cifre esadecimali che sono hash sul contenuto di un commit; ad esempio 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2:)
  • Le filiali entrano in gioco solo indirettamente :
    • Al momento della creazione di un tag , implicando il commit a cui il tag punterà :
      • Non specificare un target per un tag per impostazione predefinita è il commit più recente del ramo corrente (aka HEAD); per esempio:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Se si specifica un nome di ramo come destinazione tag, per impostazione predefinita viene eseguito il commit più recente di quel ramo; per esempio:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Come altri hanno notato, puoi anche specificare un ID commit esplicitamente come destinazione del tag.)
    • Quando si utilizza git describeper descrivere il ramo corrente:
      • git describe [--tags] descrive il ramo corrente in termini di commit dal tag [forse leggero] più recente nella storia di questo ramo .
      • Così, il tag a cui fa riferimento git describenon può riflettere il tag creato più di recente nel complesso .

Quindi, per un dato tag (ad es. V0.1.0), per sapere quale sorgente reale si trova in una build effettiva (di quella sorgente), devi davvero conoscere il ramo su cui si basava la build, giusto? Cioè, un determinato commit può avere discendenti diversi in rami diversi, giusto?
Hawkeye Parker,

2
@HawkeyeParker: non sono più immerso in questo, ma non dovresti conoscere il ramo, perché un tag identifica un commit specifico (che può far parte di più rami) e puoi indagare da lì.
mklement0

Ma se faccio git show [tagname], mostra un nome di ramo sopra Autore e Data, che contraddice "l'esecuzione di git show <tag> per vedere i dettagli di un tag non contiene alcun riferimento a nessun ramo"
Brad Thomas,

39

Tag e branch non sono completamente correlati, poiché i tag si riferiscono a un commit specifico e branch è un riferimento mobile all'ultimo commit di una cronologia. I rami vanno, i tag rimangono.

Quindi quando tagghi un commit, a git non importa quale commit o ramo sia stato estratto, se gli fornisci lo SHA1 di ciò che vuoi taggare.

Posso anche taggare facendo riferimento a un ramo (che quindi taggerà la punta del ramo), e in seguito dire che la punta del ramo è altrove ( git reset --hardad esempio), o eliminare il ramo. Il tag che ho creato tuttavia non si sposterà.


17
In altre parole, i tag sono solo dei bei nomi per i brutti hash git. Il tag (e l'hash) esiste indipendentemente dai rami esistenti (ed).
C-Otto,

8

Quando chiami solo git tag <TAGNAME>senza parametri aggiuntivi, Git creerà un nuovo tag dal tuo HEAD corrente (cioè il HEAD del tuo ramo corrente). Quando si aggiungono ulteriori commit in questo ramo, il ramo HEAD manterrà il passo con quei nuovi commit, mentre il tag si riferisce sempre allo stesso commit.

Quando chiami git tag <TAGNAME> <COMMIT>puoi anche specificare quale commit usare per creare il tag.

Indipendentemente da ciò, un tag è ancora semplicemente un "puntatore" a un determinato commit (non un ramo).


6

Possiamo creare un tag per alcuni commit passati:

git tag [tag_name] [reference_of_commit]

per esempio:

git tag v1.0 5fcdb03

1

Se vuoi taggare il ramo in cui ti trovi, quindi digita:

git tag <tag>

e spingi il ramo con:

git push origin --tags

0

Se vuoi creare un tag da un ramo che è qualcosa di simile release/yourbranchecc. Quindi dovresti usare qualcosa di simile

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Dopo aver creato il tag corretto se si desidera inviare il tag al telecomando, utilizzare il comando

git push origin YOUR_TAG_VERSION_OR_NAME
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.