Was ist der Unterschied zwischen einem mit Anmerkungen versehenen und einem nicht mit Anmerkungen versehenen Tag?

331

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?

user462301
quelle
1
@Thilo Dies ist kein genaues Duplikat. Bei der referenzierten Frage geht es darum, wann Anmerkungen zu machen sind, nicht um die zugehörigen Flags.
Todd A. Jacobs
1
Dies ist sehr gut in Gits
Samy Dindane
TLDR nicht kommentiert: Commit; kommentiert:
Festschreiben

Antworten:

254

TL; DR

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.

Weitere Informationen zu Lightweight Tags

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:

  • Wenn Sie verwenden 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).
  • Wenn Sie verwenden 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.
  • Wenn Sie verwenden git tag -a -m <msg> <tagname>, markiert Git das Commit und kommentiert es mit der bereitgestellten Nachricht.
  • Wenn Sie verwenden 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.

Todd A. Jacobs
quelle
4
Gibt es einen Unterschied zwischen einem Tag "Annotation" und einer Commit-Nachricht?
Steve Bennett
3
@SteveBennett Ja. Eine Tag-Annotation ist keine Commit-Nachricht. Sie können es nicht mit git-log (1) sehen; Sie müssen git-show (1) verwenden.
Todd A. Jacobs
114
Der Unterschied zwischen "kommentierten" und "leichten" Tags geht über die Nachricht hinaus. Sie können ein kommentiertes Tag ohne message ( git tag -a <tag> -m '') haben, aber ein kommentiertes Tag hat immer einen Tagger (Autor) und ein Datum .
Piotr Findeisen
1
Auch für mich. Versions-Tags haben normalerweise ziemlich nutzlose Nachrichten (kann es mehr als den Namen sagen? Wofür?). Leider erwähnt diese Antwort mit der höchsten Abstimmung diesen Unterschied nicht.
Piotr Findeisen
44
Ein weiterer wichtiger Punkt ist, dass beim Verschieben Ihrer Tags in ein Remote-Repository mit git push --follow-tagsnur die mit Anmerkungen versehenen Tags übertragen werden.
Xatoo
208

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 push --follow-tags pusht nur kommentierte Tags
  • git describe Ohne Befehlszeilenoptionen werden nur kommentierte Tags angezeigt

Interne 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 <[email protected]> 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 Commit
    • tag für kommentiert, da in diesem Fall ein Tag-Objekt vorhanden ist
  • Nur Lightweight-Tags auflisten: Wie kann ich alle Lightweight-Tags auflisten?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
1
Dies ist viel klarer als die derzeit akzeptierte Antwort. Vielen Dank.
Reece
43

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.

Luis
quelle