Wenn ich das aktuelle Commit markieren möchte. Ich weiß, dass beide der folgenden Befehlszeilen funktionieren:
git tag <tagname>
und
git tag -a <tagname> -m '<message>'
Was ist der Unterschied zwischen diesen Befehlen?
Wenn ich das aktuelle Commit markieren möchte. Ich weiß, dass beide der folgenden Befehlszeilen funktionieren:
git tag <tagname>
und
git tag -a <tagname> -m '<message>'
Was ist der Unterschied zwischen diesen Befehlen?
Antworten:
Der Unterschied zwischen den Befehlen besteht darin, dass einer Ihnen eine Tag-Nachricht liefert, während der andere dies nicht tut. Ein mit Anmerkungen versehenes Tag enthält eine Nachricht, die mit git-show (1) angezeigt werden kann, während ein Tag ohne Anmerkungen nur ein benannter Zeiger auf ein Commit ist.
In der Dokumentation heißt es : "Um ein leichtes Tag zu erstellen, geben Sie keine der Optionen -a, -s oder -m an, sondern geben Sie nur einen Tag-Namen an." Es gibt auch verschiedene Möglichkeiten, eine Nachricht auf kommentierte Tags zu schreiben:
git tag <tagname>
, erstellt Git bei der aktuellen Version ein Tag, fordert Sie jedoch nicht zur Eingabe einer Anmerkung auf. Es wird ohne Nachricht markiert (dies ist ein leichtes Tag).git tag -a <tagname>
, werden Sie von Git zur Eingabe einer Anmerkung aufgefordert, es sei denn, Sie haben auch das Flag -m verwendet, um eine Nachricht bereitzustellen.git tag -a -m <msg> <tagname>
, markiert Git das Commit und kommentiert es mit der bereitgestellten Nachricht.git tag -m <msg> <tagname>
, verhält sich Git so, als hätten Sie das Flag -a für Anmerkungen übergeben und die bereitgestellte Nachricht verwendet.Grundsätzlich kommt es nur darauf an, ob das Tag eine Anmerkung und einige andere damit verbundene Informationen enthalten soll oder nicht.
git tag -a <tag> -m ''
) haben, aber ein kommentiertes Tag hat immer einen Tagger (Autor) und ein Datum .
git push --follow-tags
nur die mit Anmerkungen versehenen Tags übertragen werden.
Schieben Sie kommentierte Tags, und halten Sie sie leicht lokal
man git-tag
sagt:
Mit Anmerkungen versehene Tags sind für die Freigabe vorgesehen, während Lightweight-Tags für private oder temporäre Objektbezeichnungen vorgesehen sind.
Und bestimmte Verhaltensweisen unterscheiden sie in einer Weise, dass diese Empfehlung nützlich ist, z.
Mit Anmerkungen versehene Tags können eine Nachricht, einen Ersteller und ein Datum enthalten, die sich von dem Commit unterscheiden, auf das sie verweisen. Sie können sie also verwenden, um ein Release zu beschreiben, ohne ein Release-Commit durchzuführen.
Lightweight-Tags verfügen nicht über diese zusätzlichen Informationen und benötigen sie auch nicht, da Sie sie nur selbst zum Entwickeln verwenden.
git describe
Ohne Befehlszeilenoptionen werden nur kommentierte Tags angezeigtInterne Unterschiede
Sowohl Lightweight- als auch Annotated-Tags sind eine Datei .git/refs/tags
, die einen SHA-1 enthält
Bei Lightweight-Tags verweist der SHA-1 direkt auf ein Commit:
git tag light
cat .git/refs/tags/light
druckt das gleiche wie der SHA-1 des KOPFES.
Kein Wunder also, dass sie keine anderen Metadaten enthalten können.
Mit Anmerkungen versehene Tags verweisen auf ein Tag-Objekt in der Objektdatenbank.
git tag -as -m msg annot
cat .git/refs/tags/annot
enthält die SHA des mit Anmerkungen versehenen Tag-Objekts:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
und dann können wir seinen Inhalt erhalten mit:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
Beispielausgabe:
object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
type commit
tag annot
tagger Ciro Santilli <your@mail.com> 1411478848 +0200
msg
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
<YOUR PGP SIGNATURE>
-----END PGP SIGNAT
Und so enthält es zusätzliche Metadaten. Wie wir aus der Ausgabe sehen können, sind die Metadatenfelder:
Eine detailliertere Analyse des Formats finden Sie unter: Was ist das Format eines Git-Tag-Objekts und wie berechnet man seinen SHA?
Boni
Bestimmen Sie, ob ein Tag mit Anmerkungen versehen ist:
git cat-file -t tag
Ausgänge
commit
Da für Lightweight kein Tag-Objekt vorhanden ist, verweist es direkt auf das Committag
für kommentiert, da in diesem Fall ein Tag-Objekt vorhanden istNur Lightweight-Tags auflisten: Wie kann ich alle Lightweight-Tags auflisten?
Der große Unterschied ist perfekt erklärt hier .
Grundsätzlich sind Lightweight-Tags nur Zeiger auf bestimmte Commits. Es werden keine weiteren Informationen gespeichert . auf der anderen Seite, kommentierte Tags sind normale Objekte , die ein Autor und ein Datum und können genannt werden , weil sie ihre eigenen SHA Schlüssel haben.
Wenn Sie wissen, wer was und wann markiert hat, verwenden Sie kommentierte Tags. Wenn Sie nur einen bestimmten Punkt in Ihrer Entwicklung markieren möchten , egal wer und wann dies getan hat, sind leichte Tags gut genug.
Normalerweise würden Sie sich für kommentierte Tags entscheiden, aber es liegt wirklich am Git-Master des Projekts.