Warum hat Git Tags?

8

Ich habe gelesen , Git Verzweigen und Markieren Best Practices und git Tagging Kommentare - Best Practices , aber ich habe keine direkte Antwort auf etwas , sehe ich für eine lange Zeit gefragt haben:

Warum hat Git Tags? (statt nur Zweige)

Sie scheinen Bürger zweiter Klasse zu sein oder zumindest "anders". Sie werden nicht gepusht, es sei denn, Sie geben dies explizit an. Das Löschen von Remote-Tags führt nicht zum Löschen in nachgeschalteten Repos.

Dieser letzte Punkt war kürzlich ein Problem, als jemand eine Reihe von Mülletiketten mit Tonnen von Commits von einem anderen Repo schob. Wir könnten sie stromaufwärts löschen und die Commits überprüfen, aber das würde sich nicht verbreiten, und wenn jemand das nächste Mal ein Tag mit schob git push --tags, würden sie diese Müll-Tags und Commits zurückweisen. Also mussten wir sicherstellen, dass alle sie löschten.

Wann und warum sollte ich ein Tag anstelle eines Zweigs verwenden?

Paul Draper
quelle
1
Zum einen können Tags mit Anmerkungen versehen werden, Zweige nicht. Tags sind im Allgemeinen "permanente" Dinge (normalerweise zum Markieren bestimmter Versionen eines Projekts).
Rufflewind

Antworten:

10

Dies geschieht absichtlich .

Sie scheinen Bürger zweiter Klasse zu sein oder zumindest "anders". Sie werden nicht gepusht, es sei denn, Sie geben dies explizit an. Das Löschen von Remote-Tags führt nicht zum Löschen in nachgeschalteten Repos.

Ich bin nicht mit der Antwort von lxrec einverstanden, dass Git schlechte Standardeinstellungen hat. Wenn Sie der Mailingliste folgen, können Sie sehen, dass Git-Entwickler sich tatsächlich um vernünftige Standardeinstellungen kümmern. Wäre es sinnvoll, --ff-onlyals Standard zu haben ? Das glaube ich nicht.

Tags ermöglichen das Erstellen von Anmerkungen für Ihre eigene lokale Entwicklungskopie. Ich möchte nicht, dass meine why_does_it_break_hereund todo_fix_formattingTags ohne meine Zustimmung gepusht werden (dies sind keine tatsächlichen Tag-Namen). Das Markieren einer Version tritt dagegen seltener auf, und es ist sinnvoll, einen expliziten Push zu erfordern (oder einen Alias ​​zu verwenden).

Ich sehe keinen großen Unterschied zwischen Tags und Zweigen hinsichtlich des Verhaltens von Push / Fetch. Wenn in Ihrem Beispiel die Garbage Tags Verzweigungen gewesen wären, würde sich das Löschen wie beabsichtigt verbreiten?

Wann und warum sollte ich ein Tag anstelle eines Zweigs verwenden?

Allgemein gesagt:

  • Zweige sind für Bäume: Sie weisen auf unterschiedliche Commits im Laufe der Zeit hin
  • Tags sind für einzelne Commits und unveränderlich (dies schließt gefrorene Bäume wie Releases ein).
Core-Dump
quelle
Werden nicht annotierte Tags und signierte annotierte Tags (dh diejenigen, die man beispielsweise zum Markieren einer öffentlichen Version tatsächlich verwenden würde) nicht standardmäßig gepusht? Es sind nur nicht kommentierte "lokale" Tags, die nicht standardmäßig gepusht werden, da sie, wie Sie sagten, lokal sind .
Jörg W Mittag
@ JörgWMittag Ich habe nicht nachgesehen, aber ich vertraue dir darauf. Moment mal, das würde bedeuten, dass Git vernünftige Standardeinstellungen hat?!
Coredump
@ JörgWMittag Also habe ich es lokal mit zwei Repositorys in verschiedenen Verzeichnissen versucht, und weder kommentierte Tags noch kommentierte + signierte Tags wurden gepusht. Dies ist mit Git 1.8.2.
Coredump
Ah, warte. Ich denke, es ist mit Anmerkungen versehen und signierte Tags werden automatisch gepusht git push --tags, lokale Tags jedoch nicht. Es ist schon eine Weile her, dass ich Git im Zorn benutzt habe, das war lange vor Git 1.0.
Jörg W Mittag
1

1) Warum sind Git-Tags Bürger zweiter Klasse?

Weil Git leider viele schlechte Standardeinstellungen hat. So sehr ich es auch mag, es ist einfach kein sehr für Anfänger geeignetes oder intuitives Werkzeug. Ziemlich jeder muss Git-Konfigurationen oder Aliase oder Skripte einrichten, die etwa ein Dutzend der - Optionen (wie --ff-only) verwenden, damit sich Git so verhält, wie er es eigentlich möchte. Tags sind nur ein weiteres Beispiel.

2) Warum sollte ich ein Git-Tag anstelle eines Zweigs verwenden?

Ein Zweig soll ein Commit markieren, über das Sie andere Commits ausführen. Wenn Sie einen neuen Commit für diesen Zweig durchführen, "verschiebt" sich der Zweig selbst so, dass er auf den neuen Commit zeigt.

Ein Tag hingegen markiert ein Commit und markiert dann dasselbe Commit so ziemlich für immer (theoretisch). Die häufigste Verwendung ist das Kennzeichnen von Commits mit ihren offiziellen Release-Versionen, wenn Sie eine neue Version für die Produktion bereitstellen.

Wir verwenden sowohl Zweige als auch Tags für unsere Release-Versionen. Der Zweig repräsentiert lediglich die Haupt- / Nebenversion, während die Tags Patch- / Build-Versionen innerhalb dieser Haupt- / Nebenversion angeben. Wenn wir also einen Bugfix auf eine alte Version anwenden müssen, wählen wir einfach das Bugfix-Commit vom Master in den entsprechenden Zweig aus und kennzeichnen das neue Commit mit der neuen Versionsnummer, die es während der Bereitstellung erhält.

Ixrec
quelle