Gilt Git-Tags nur für den aktuellen Zweig?

153

Ich arbeite derzeit mit einem Repository mit mehreren Zweigen.

Bezieht sich dieses Tag beim Erstellen eines Tags auf den dann aktuellen Zweig?

Mit anderen Worten: Muss ich bei jedem Erstellen eines Tags zum gewünschten Zweig und Tag innerhalb dieses Zweigs wechseln, damit sich das Tag zu diesem Zeitpunkt auf diesen Zweig bezieht?

Gerardo
quelle

Antworten:

149

Wenn Sie ein Tag erstellen, z

git tag v1.0

Das Tag bezieht sich auf das letzte Commit des Zweigs, in dem Sie sich gerade befinden. Sie können den Zweig ändern und dort ein Tag erstellen.

Sie können beim Markieren auch einfach auf den anderen Zweig verweisen.

git tag v1.0 name_of_other_branch

Dadurch wird das Tag für das letzte Commit des anderen Zweigs erstellt.

Oder Sie können das Tag einfach an einer beliebigen Stelle platzieren, unabhängig von der Verzweigung, indem Sie direkt auf die SHA1 eines Commits verweisen

git tag v1.0 <sha1>
Kalle Pokki
quelle
199

Die Antwort von CharlesB und Helmbert sind beide hilfreich, aber ich habe eine Weile gebraucht, um sie zu verstehen. Hier ist eine andere Art, es auszudrücken:

  • Ein Tag ist ein Zeiger auf ein Commit , und Commits existieren unabhängig von Zweigen .
    • Es ist wichtig zu verstehen, dass Tags keine direkte Beziehung zu Zweigen haben - sie identifizieren immer nur ein Commit .
      • Auf dieses Commit kann von einer beliebigen Anzahl von Zweigen aus hingewiesen werden - dh es kann Teil der Geschichte einer beliebigen Anzahl von Zweigen sein - einschließlich keiner.
    • Daher enthält das Ausführen git show <tag>zum Anzeigen der Details eines Tags keinen Verweis auf Verzweigungen, sondern nur die ID des Commits, auf das das Tag verweist.
      • (Commit IDs (auch bekannt als Objektnamen oder SHA-1 - IDs) sind 40-Zeichenketten zusammengesetzt hex Ziffern , die Hash - Werte über den Inhalt eines commit sind, zB:. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Zweige kommen nur indirekt ins Spiel :
    • Zum Zeitpunkt des Erstellens eines Tags , indem Sie das Commit implizieren, auf das das Tag verweist :
      • Wenn Sie kein Ziel für ein Tag angeben, wird standardmäßig das letzte Commit des aktuellen Zweigs (auch bekannt als HEAD) verwendet. z.B:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Wenn Sie einen Zweignamen als Tag-Ziel angeben, wird standardmäßig das letzte Commit dieses Zweigs verwendet. z.B:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Wie andere angemerkt haben, können Sie auch eine Commit-ID explizit als Ziel des Tags angeben.)
    • Bei Verwendung git describezur Beschreibung des aktuellen Zweigs:
      • git describe [--tags] beschreibt den aktuellen Zweig in Bezug auf die Commits seit dem letzten [möglicherweise leichtgewichtigen] Tag in der Geschichte dieses Zweigs .
      • Daher spiegelt das Tag , auf das verwiesen wird, git describemöglicherweise NICHT das zuletzt erstellte Tag insgesamt wider .
mklement0
quelle
Damit ein bestimmtes Tag (z. B. v0.1.0) weiß, welche tatsächliche Quelle sich in einem tatsächlichen Build (dieser Quelle) befindet, müssen Sie wirklich wissen, auf welchem ​​Zweig der Build basiert, oder? Das heißt, ein bestimmtes Commit kann verschiedene Nachkommen in verschiedenen Zweigen haben, oder?
Hawkeye Parker
2
@ HawkeyeParker: Ich bin nicht mehr damit beschäftigt, aber Sie sollten den Zweig nicht kennen müssen, da ein Tag ein bestimmtes Commit identifiziert (das Teil mehrerer Zweige sein kann) und Sie von dort aus nachforschen können.
mklement0
Aber wenn ich git show [tagname] mache, dann zeigt es einen Zweignamen über Autor und Datum an, was im Widerspruch zu "git show <tag> ausführen, um zu sehen, dass die Details eines Tags keinen Verweis auf irgendwelche Zweige enthalten"
Brad Thomas
38

Tags und Verzweigungen haben keine Beziehung zueinander, da Tags auf ein bestimmtes Commit verweisen und Verzweigung ein bewegender Verweis auf das letzte Commit eines Verlaufs ist. Zweige gehen, Tags bleiben.

Wenn Sie also ein Commit markieren, ist es git egal, welches Commit oder welcher Zweig ausgecheckt ist, wenn Sie ihm den SHA1 von dem bereitstellen, was Sie markieren möchten.

Ich kann sogar taggen, indem ich mich auf einen Zweig beziehe (er markiert dann die Spitze des Zweigs) und später sagen, dass sich die Spitze des Zweigs an einer anderen Stelle befindet (mit git reset --hardzum Beispiel), oder den Zweig löschen. Das von mir erstellte Tag wird jedoch nicht verschoben.

CharlesB
quelle
17
Mit anderen Worten, Tags sind nur nette Namen für die hässlichen Git-Hashes. Das Tag (und der Hash) existieren unabhängig davon, welche Zweige existieren (ed).
C-Otto
8

Wenn Sie nur anrufen git tag <TAGNAME> ohne zusätzliche Parameter , erstellt Git ein neues Tag aus Ihrem aktuellen HEAD (dh dem HEAD Ihres aktuellen Zweigs). Wenn Sie diesem Zweig zusätzliche Commits hinzufügen, hält der Zweig HEAD mit diesen neuen Commits Schritt, während sich das Tag immer auf dasselbe Commit bezieht.

Beim Aufruf können git tag <TAGNAME> <COMMIT>Sie sogar angeben, welches Commit zum Erstellen des Tags verwendet werden soll.

Unabhängig davon ist ein Tag immer noch einfach ein "Zeiger" auf ein bestimmtes Commit (kein Zweig).

Helmbert
quelle
6

Wir können ein Tag für ein früheres Commit erstellen:

git tag [tag_name] [reference_of_commit]

z.B:

git tag v1.0 5fcdb03
Sana Hameed
quelle
1

Wenn Sie den Zweig markieren möchten, in dem Sie sich befinden, geben Sie Folgendes ein:

git tag <tag>

und schieben Sie den Zweig mit:

git push origin --tags
Mutatos
quelle
0

Wenn Sie ein Tag aus einem Zweig erstellen möchten, der so etwas wie release/yourbranchetc ist, sollten Sie so etwas wie verwenden

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Wenn Sie das Tag nach dem Erstellen des richtigen Tags auf die Fernbedienung übertragen möchten, verwenden Sie den Befehl

git push origin YOUR_TAG_VERSION_OR_NAME
BharathRao
quelle