Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
-
2.52.0
2025-11-17
- 2.46.1 → 2.51.2 keine Änderungen
-
2.46.0
2024-07-29
- 2.45.1 → 2.45.4 keine Änderungen
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 keine Änderungen
-
2.44.0
2024-02-23
- 2.42.1 → 2.43.7 keine Änderungen
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 keine Änderungen
-
2.41.0
2023-06-01
- 2.39.1 → 2.40.4 keine Änderungen
-
2.39.0
2022-12-12
- 2.35.1 → 2.38.5 keine Änderungen
-
2.35.0
2022-01-24
- 2.31.1 → 2.34.8 keine Änderungen
-
2.31.0
2021-03-15
- 2.29.1 → 2.30.9 keine Änderungen
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 keine Änderungen
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 keine Änderungen
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 keine Änderungen
-
2.23.0
2019-08-16
- 2.21.1 → 2.22.5 keine Änderungen
-
2.21.0
2019-02-24
- 2.19.3 → 2.20.5 keine Änderungen
-
2.19.2
2018-11-21
- 2.19.1 keine Änderungen
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 keine Änderungen
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 keine Änderungen
-
2.17.0
2018-04-02
- 2.15.4 → 2.16.6 keine Änderungen
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
- 2.8.6 keine Änderungen
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
- 2.5.6 keine Änderungen
-
2.4.12
2017-05-05
- 2.2.3 → 2.3.10 keine Änderungen
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
SYNOPSIS
gittag[-a|-s|-u<key-id>] [-f] [-m<msg> |-F<file>] [-e] [(--trailer<token>[(=|:)<value>])…] <tagname> [<commit> | <object>]gittag-d<tagname>…gittag[-n[<num>]]-l[--contains<commit>] [--no-contains<commit>] [--points-at<object>] [--column[=<options>] |--no-column] [--create-reflog] [--sort=<key>] [--format=<format>] [--merged<commit>] [--no-merged<commit>] [<pattern>…]gittag-v[--format=<format>] <tagname>…
BESCHREIBUNG
Fügt einen Tag-Referenz in refs/tags/ hinzu, es sei denn, -d/-l/-v wird angegeben, um Tags zu löschen, aufzulisten oder zu überprüfen.
Wenn -f nicht angegeben wird, darf der benannte Tag noch nicht existieren.
Wenn eine der Optionen -a, -s oder -u <key-id> übergeben wird, erstellt der Befehl ein Tag-Objekt und erfordert eine Tag-Nachricht. Wenn nicht -m <msg> oder -F <file> angegeben wird, wird ein Editor gestartet, damit der Benutzer die Tag-Nachricht eingeben kann.
Wenn -m <msg> oder -F <file> oder --trailer <token>[=<value>] angegeben wird und -a, -s und -u <key-id> fehlen, wird -a impliziert.
Andernfalls wird eine Tag-Referenz erstellt, die direkt auf das angegebene Objekt zeigt (d.h. ein Lightweight-Tag).
Ein kryptografisch signiertes Tag-Objekt wird erstellt, wenn -s oder -u <key-id> verwendet wird. Das Signierungsbackend (GPG, X.509, SSH usw.) wird durch die Konfigurationsvariable gpg.format gesteuert, die standardmäßig OpenPGP ist. Wenn -u <key-id> nicht verwendet wird, wird die Committer-Identität des aktuellen Benutzers verwendet, um den Schlüssel zum Signieren zu finden. Die Konfigurationsvariable gpg.program wird verwendet, um ein benutzerdefiniertes Signierungsbinary anzugeben.
Tag-Objekte (erstellt mit -a, -s oder -u) werden als "annotated" Tags bezeichnet; sie enthalten ein Erstellungsdatum, den Namen und die E-Mail-Adresse des Taggers, eine Tag-Nachricht und eine optionale kryptografische Signatur. Ein "lightweight" Tag ist dagegen einfach ein Name für ein Objekt (normalerweise ein Commit-Objekt).
Annotated-Tags sind für Releases gedacht, während Lightweight-Tags für private oder temporäre Objektbezeichnungen gedacht sind. Aus diesem Grund ignorieren einige Git-Befehle zum Benennen von Objekten (wie z.B. git describe) standardmäßig Lightweight-Tags.
OPTIONEN
-a--annotate-
Erstellt ein unsigniertes, annotiertes Tag-Objekt
-s--sign-
Erstellt ein kryptografisch signiertes Tag mit dem Standard-Signierschlüssel. Das verwendete Signierungsbackend hängt von der Konfigurationsvariable
gpg.formatab. Der Standard-Schlüssel wird vom Backend bestimmt. Für GPG basiert er auf der E-Mail-Adresse des Committters, während er für SSH eine bestimmte Schlüsseldatei oder Agent-Identität sein kann. Siehe git-config[1]. --no-sign-
Überschreibt die Konfigurationsvariable
tag.gpgSign, die so eingestellt ist, dass jedes einzelne Tag signiert wird. -u<key-id>--local-user=<key-id>-
Erstellt ein kryptografisch signiertes Tag mit dem angegebenen Schlüssel. Das Format des <key-id> und das verwendete Backend hängen von der Konfigurationsvariable
gpg.formatab. Siehe git-config[1]. -f--force-
Ersetzt ein vorhandenes Tag mit dem angegebenen Namen (statt einen Fehler auszugeben)
-d--delete-
Löscht vorhandene Tags mit den angegebenen Namen.
-v--verify-
Überprüft die kryptografische Signatur der angegebenen Tags.
-n<num>-
<num> gibt an, wie viele Zeilen aus der Annotation, falls vorhanden, beim Verwenden von
-lgedruckt werden. Impliziert--list.Standardmäßig werden keine Annotationszeilen gedruckt. Wenn keine Zahl an
-nübergeben wird, wird nur die erste Zeile gedruckt. Wenn der Tag nicht annotiert ist, wird stattdessen die Commit-Nachricht angezeigt. -l--list-
Listet Tags auf. Mit optionalem <pattern>..., z.B.
gittag--listv-*', werden nur die Tags aufgelistet, die mit den Mustern übereinstimmen.Wenn
gittagohne Argumente aufgerufen wird, werden ebenfalls alle Tags aufgelistet. Das Muster ist ein Shell-Wildcard (d.h. übereinstimmend mitfnmatch(3)). Mehrere Muster können angegeben werden; wenn eines davon übereinstimmt, wird der Tag angezeigt.Diese Option wird implizit bereitgestellt, wenn eine andere Listen-ähnliche Option (wie
--contains) angegeben wird. Details hierzu finden Sie in der Dokumentation für jede dieser Optionen. --sort=<key>-
Sortiert basierend auf dem angegebenen Schlüssel. Präfix
-, um in absteigender Reihenfolge des Werts zu sortieren. Sie können die Option--sort=<key> mehrmals verwenden, wobei der letzte <key> zum Primärschlüssel wird. Unterstützt auch "version:refname" oder "v:refname" (Tag-Namen werden als Versionen behandelt). Die Sortierung "version:refname" kann auch durch die Konfigurationsvariable "versionsort.suffix" beeinflusst werden. Die unterstützten Schlüssel sind dieselben wie beigitfor-each-ref. Die Sortierreihenfolge ist standardmäßig der Wert, der für die Variabletag.sortkonfiguriert ist, falls vorhanden, andernfalls lexikografische Ordnung. Siehe git-config[1]. --color[=<when>]-
Berücksichtigt alle Farben, die in der Option
--formatangegeben sind. Das Feld <when> muss entwederalways,neveroderautosein (wenn <when> fehlt, wird es so behandelt, als wärealwaysangegeben). -i--ignore-case-
Sortierung und Filterung von Tags sind case-insensitiv.
--omit-empty-
Druckt keine neue Zeile nach formatierten Refs, bei denen das Format zu einer leeren Zeichenkette expandiert.
--column[=<options>]--no-column-
Zeigt die Tag-Liste in Spalten an. Siehe die Konfigurationsvariable
column.tagfür die Syntax der Optionen.--columnund--no-columnohne Optionen sind äquivalent zualwaysbzw.never.Diese Option ist nur anwendbar, wenn Tags ohne Annotationszeilen aufgelistet werden.
--contains[<commit>]-
Listet nur Tags auf, die <commit> enthalten (standardmäßig
HEAD). Impliziert--list. --no-contains[<commit>]-
Listet nur Tags auf, die <commit> nicht enthalten (standardmäßig
HEAD). Impliziert--list. --merged[<commit>]-
Listet nur Tags auf, deren Commits von <commit> (standardmäßig
HEAD) erreichbar sind. --no-merged[<commit>]-
Listet nur Tags auf, deren Commits nicht von <commit> (standardmäßig
HEAD) erreichbar sind. --points-at[<object>]-
Listet nur Tags von <object> (standardmäßig
HEAD) auf. Impliziert--list. -m<msg>--message=<msg>-
Verwendet <msg> (statt zur Eingabe aufzufordern). Wenn mehrere
-m-Optionen angegeben werden, werden ihre Werte als separate Absätze verkettet. Impliziert-a, wenn keine der Optionen-a,-soder-u<key-id> angegeben wird. -F<file>--file=<file>-
Nimmt die Tag-Nachricht aus <file>. Verwenden Sie
-, um die Nachricht von der Standardeingabe zu lesen. Impliziert-a, wenn keine der Optionen-a,-soder-u<key-id> angegeben wird. --trailer<token>[(=|:)<value>]-
Gibt ein (<token>, <value>)-Paar an, das als Trailer angewendet werden soll. (z.B.
gittag--trailer"Custom-Key:value"fügt der Tag-Nachricht einen "Custom-Key"-Trailer hinzu.) Die Konfigurationsvariablentrailer.*(git-interpret-trailers[1]) können verwendet werden, um festzulegen, ob ein doppelter Trailer weggelassen wird, an welcher Stelle in der Liste der Trailer jeder Trailer erscheinen soll und weitere Details. Die Trailer können ingittag--listextrahiert werden, indem der Platzhalter--format="%(trailers)"verwendet wird. -e--edit-
Ermöglicht die weitere Bearbeitung der Nachricht, die aus einer Datei mit
-Fund von der Kommandozeile mit-mübernommen wurde. --cleanup=<mode>-
Legt fest, wie die Tag-Nachricht bereinigt wird. Der <mode> kann einer der folgenden sein:
verbatim,whitespaceundstrip. Derstrip-Modus ist Standard. Derverbatim-Modus ändert die Nachricht überhaupt nicht,whitespaceentfernt nur führende/nachfolgende Leerzeilen undstripentfernt sowohl Leerzeichen als auch Kommentare. --create-reflog-
Erstellt einen Reflog für das Tag. Um Reflogs für Tags global zu aktivieren, siehe
core.logAllRefUpdatesin git-config[1]. Die negierte Form--no-create-reflogüberschreibt nur ein früheres--create-reflog, negiert aber derzeit nicht die Einstellung voncore.logAllRefUpdates. --format=<format>-
Eine Zeichenkette, die
%(fieldname) aus einem angezeigten Tag-Ref und dem Objekt, auf das es zeigt, interpoliert. Das Format ist dasselbe wie bei git-for-each-ref[1]. Wenn nicht angegeben, wird standardmäßig%(refname:strip=2) verwendet. - <tagname>
-
Der Name des zu erstellenden, zu löschenden oder zu beschreibenden Tags. Der neue Tag-Name muss alle von git-check-ref-format[1] definierten Prüfungen bestehen. Einige dieser Prüfungen können die Zeichen einschränken, die in einem Tag-Namen zulässig sind.
- <commit>
- <object>
-
Das Objekt, auf das der neue Tag zeigen wird, normalerweise ein Commit. Standardmäßig
HEAD.
KONFIGURATION
Standardmäßig verwendet git tag im Signierungsmodus mit Standardwert (-s) Ihre Committer-Identität (im Format Your Name <your@email.address>), um einen Schlüssel zu finden. Wenn Sie einen anderen Standard-Schlüssel verwenden möchten, können Sie ihn in der Repository-Konfiguration wie folgt angeben:
[user]
signingKey = <key-id>
Das Signierungsbackend kann über die Konfigurationsvariable gpg.format ausgewählt werden, die standardmäßig openpgp ist. Siehe git-config[1] für eine Liste anderer unterstützter Formate.
Der Pfad zum Programm, das für jedes Signierungsbackend verwendet wird, kann mit der Konfigurationsvariable gpg.<format>.program angegeben werden. Für das openpgp-Backend kann gpg.program als Synonym für gpg.openpgp.program verwendet werden. Siehe git-config[1] für Details.
pager.tag wird nur berücksichtigt, wenn Tags aufgelistet werden, d.h. wenn -l verwendet oder impliziert wird. Standardmäßig wird ein Pager verwendet.
Weitere Details und andere Konfigurationsvariablen finden Sie unter git-config[1].
DISKUSSION
Beim erneuten Taggen
Was tun Sie, wenn Sie einen falschen Commit getaggt haben und den Tag ändern möchten?
Wenn Sie noch nichts veröffentlicht haben, ändern Sie den Tag einfach. Verwenden Sie -f, um den alten zu ersetzen. Und Sie sind fertig.
Aber wenn Sie etwas veröffentlicht haben (oder andere Ihr Repository direkt lesen können), dann haben andere den alten Tag bereits gesehen. In diesem Fall können Sie eines von zwei Dingen tun:
-
Die vernünftige Sache. Geben Sie einfach zu, dass Sie einen Fehler gemacht haben, und verwenden Sie einen anderen Namen. Andere haben bereits einen Tag-Namen gesehen, und wenn Sie denselben Namen beibehalten, könnten Sie in der Situation sein, dass zwei Personen "Version X" haben, aber tatsächlich *unterschiedliche* "X"s haben. Nennen Sie es also einfach "X.1" und fertig.
-
Die unsinnige Sache. Sie möchten die neue Version wirklich auch "X" nennen, *obwohl* andere sie bereits gesehen haben. Verwenden Sie also einfach erneut
gittag-f, als hätten Sie den alten noch nicht veröffentlicht.
Git ändert jedoch Tags nicht (und sollte dies auch nicht) hinter dem Rücken der Benutzer. Wenn also jemand den alten Tag erhalten hat, sollte ein git pull von Ihrem Baum nicht einfach dazu führen, dass dieser den alten überschreibt.
Wenn jemand einen Release-Tag von Ihnen erhalten hat, können Sie den Tag nicht einfach für ihn ändern, indem Sie Ihren eigenen aktualisieren. Dies ist ein großes Sicherheitsproblem, da Personen sich auf ihre Tag-Namen verlassen können müssen. Wenn Sie die unsinnige Sache wirklich tun wollen, müssen Sie es einfach zugeben und den Leuten sagen, dass Sie sich geirrt haben. Sie können dies tun, indem Sie eine sehr öffentliche Ankündigung machen, die besagt:
Ok, I messed up, and I pushed out an earlier version tagged as X. I then fixed something, and retagged the *fixed* tree as X again. If you got the wrong tag, and want the new one, please delete the old one and fetch the new one by doing: git tag -d X git fetch origin tag X to get my updated tag. You can test which tag you have by doing git rev-parse X which should return 0123456789abcdef.. if you have the new version. Sorry for the inconvenience.
Scheint das etwas kompliziert? Das sollte es auch sein. Es gibt keine Möglichkeit, dies automatisch zu "korrigieren". Die Leute müssen wissen, dass ihre Tags möglicherweise geändert wurden.
Zur automatischen Verfolgung
Wenn Sie den Baum eines anderen verfolgen, verwenden Sie höchstwahrscheinlich Remote-Tracking-Branches (z.B. refs/remotes/origin/master). Sie möchten normalerweise die Tags vom anderen Ende haben.
Andererseits, wenn Sie Fetchen, weil Sie eine einmalige Zusammenführung von jemand anderem wünschen, möchten Sie in der Regel keine Tags von dort erhalten. Dies geschieht häufiger bei Personen am oberen Ende, aber nicht nur bei ihnen. Normale Benutzer, die voneinander ziehen, möchten nicht unbedingt automatisch private Ankerpunkt-Tags vom anderen erhalten.
Oft geben "please pull"-Nachrichten in Mailinglisten nur zwei Informationen: eine Repo-URL und einen Branch-Namen. Dies ist so konzipiert, dass es leicht in eine git fetch-Befehlszeile kopiert und eingefügt werden kann.
Linus, please pull from git://git..../proj.git master to get the following updates...
wird zu
$ git pull git://git..../proj.git master
In einem solchen Fall möchten Sie die Tags des anderen nicht automatisch verfolgen.
Ein wichtiger Aspekt von Git ist seine verteilte Natur, was weitgehend bedeutet, dass es im System kein inhärentes "Upstream" oder "Downstream" gibt. Oberflächlich betrachtet könnte das obige Beispiel darauf hindeuten, dass der Tag-Namespace von der obersten Schicht der Leute besessen ist und dass Tags nur nach unten fließen, aber das ist nicht der Fall. Es zeigt nur, dass das Nutzungsmuster bestimmt, wer an wessen Tags interessiert ist.
Ein einmaliger Pull ist ein Zeichen dafür, dass eine Commit-Historie jetzt die Grenze zwischen einem Kreis von Leuten (z.B. "Leute, die sich hauptsächlich für den Netzwerkteil des Kernels interessieren") mit ihren eigenen Tags (z.B. "Dies ist der dritte Release Candidate der Netzwerkgruppe, der für den allgemeinen Gebrauch mit der Veröffentlichung 2.6.21 vorgeschlagen wird") zu einem anderen Kreis von Leuten (z.B. "Leute, die verschiedene Subsystem-Verbesserungen integrieren") überquert. Letztere sind normalerweise nicht an den detaillierten Tags interessiert, die intern in der ersteren Gruppe verwendet werden (das bedeutet "intern"). Deshalb ist es wünschenswert, Tags in diesem Fall nicht automatisch zu verfolgen.
Es mag sein, dass Netzwerk-Leute untereinander interne Tags austauschen wollen, aber in diesem Workflow verfolgen sie höchstwahrscheinlich die Fortschritte voneinander, indem sie Remote-Tracking-Branches haben. Auch hier ist die Heuristik, solche Tags automatisch zu verfolgen, eine gute Sache.
Zur Rückdatierung von Tags
Wenn Sie Änderungen aus einem anderen VCS importiert haben und Tags für wichtige Releases Ihrer Arbeit hinzufügen möchten, ist es nützlich, das Datum angeben zu können, das in das Tag-Objekt eingebettet werden soll; solche Daten im Tag-Objekt beeinflussen beispielsweise die Reihenfolge der Tags in der Gitweb-Oberfläche.
Um das Datum für zukünftige Tag-Objekte festzulegen, setzen Sie die Umgebungsvariable GIT_COMMITTER_DATE (siehe die spätere Diskussion möglicher Werte; die gängigste Form ist "JJJJ-MM-TT HH:MM").
Zum Beispiel
$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1
DATUMSFORMATE
Die Umgebungsvariablen GIT_AUTHOR_DATE und GIT_COMMITTER_DATE unterstützen die folgenden Datumsformate:
- Git internes Format
-
Es ist <unix-timestamp> <time-zone-offset>, wobei <unix-timestamp> die Anzahl der Sekunden seit der UNIX-Epoche ist. <time-zone-offset> ist ein positiver oder negativer Offset von UTC. Zum Beispiel ist CET (das 1 Stunde vor UTC liegt)
+0100. - RFC 2822
-
Das Standard-Datumsformat wie in RFC 2822 beschrieben, zum Beispiel
Thu,07Apr200522:13:13+0200. - ISO 8601
-
Zeit und Datum gemäß dem ISO 8601-Standard, zum Beispiel
2005-04-07T22:13:13. Der Parser akzeptiert auch ein Leerzeichen anstelle desT-Zeichens. Bruchteile von Sekunden werden ignoriert, zum Beispiel wird2005-04-07T22:13:13.019als2005-04-07T22:13:13behandelt.HinweisZusätzlich werden Datumsangaben in den folgenden Formaten akzeptiert: JJJJ.MM.TT,MM/TT/JJJJundTT.MM.JJJJ.
DATEIEN
$GIT_DIR/TAG_EDITMSG-
Diese Datei enthält die Nachricht eines im Gange befindlichen annotierten Tags. Wenn
gittagaufgrund eines Fehlers beendet wird, bevor ein annotiertes Tag erstellt wird, ist die vom Benutzer in einer Editorsitzung bereitgestellte Tag-Nachricht in dieser Datei verfügbar, kann aber bei der nächsten Ausführung vongittagüberschrieben werden.
KONFIGURATION
Alles unterhalb dieser Zeile in diesem Abschnitt wird selektiv aus der git-config[1]-Dokumentation übernommen. Der Inhalt ist derselbe wie dort zu finden.
tag.forceSignAnnotated-
Ein boolescher Wert, der angibt, ob erstellte annotierte Tags GPG-signiert werden sollen. Wenn
--annotateauf der Kommandozeile angegeben wird, hat dies Vorrang vor dieser Option. tag.sort-
Diese Variable steuert die Sortierreihenfolge von Tags, wenn sie von
git-tagangezeigt werden. Ohne die Option--sort=<value> wird der Wert dieser Variable als Standard verwendet. tag.gpgSign-
Ein boolescher Wert, der angibt, ob alle Tags GPG-signiert werden sollen. Die Verwendung dieser Option in einem automatisierten Skript kann dazu führen, dass eine große Anzahl von Tags signiert wird. Es ist daher praktisch, einen Agenten zu verwenden, um zu vermeiden, dass Ihre GPG-Passphrase mehrmals eingegeben werden muss. Beachten Sie, dass diese Option das Tag-Signierungsverhalten, das durch die Optionen
-u<keyid> oder--local-user=<keyid> aktiviert wird, nicht beeinflusst.
ANMERKUNGEN
Bei der Kombination mehrerer --contains- und --no-contains-Filter werden nur Referenzen angezeigt, die mindestens einen der --contains-Commits enthalten und keinen der --no-contains-Commits enthalten.
Bei der Kombination mehrerer --merged- und --no-merged-Filter werden nur Referenzen angezeigt, die von mindestens einem der --merged-Commits erreichbar sind und von keinem der --no-merged-Commits.
GIT
Teil der git[1] Suite