Zeigen Sie, auf welchem ​​Git-Tag Sie sich befinden?

216

Ich habe Probleme herauszufinden, welches Tag gerade ausgecheckt ist.

Wenn ich es tue:

git checkout tag1
git branch

Ich kann anscheinend nicht herausfinden, auf welchem ​​Tag ich mich befinde. Es werden nur protokolliert:

* (no branch)
master

Ist es möglich herauszufinden, welche Tags ausgecheckt sind? Im obigen Beispiel wäre dies tag1.

grm
quelle

Antworten:

326

Edit : Jakub Narębski hat mehr Git-Fu. Der folgende viel einfachere Befehl funktioniert perfekt:

git describe --tags

(Oder ohne das, --tagswenn Sie ein mit Anmerkungen versehenes Tag ausgecheckt haben. Mein Tag ist leichtgewichtig, daher benötige ich die --tags.)

Die ursprüngliche Antwort folgt:

git describe --exact-match --tags $(git log -n1 --pretty='%h')

Jemand mit mehr Git-Fu hat vielleicht eine elegantere Lösung ...

Dies nutzt die Tatsache, dass git-logdas Protokoll ab dem beginnt, was Sie ausgecheckt haben. %hdruckt den abgekürzten Hash. Dann git describe --exact-match --tagsfindet den Tag (leichten oder mit Anmerkungen versehen) , die genau Matches, die zu begehen.

Bei der $()obigen Syntax wird davon ausgegangen, dass Sie Bash oder ähnliches verwenden.

bstpierre
quelle
22
Mit nur git describewürde Tag - Namen zeigen , wenn Sie genau auf sind (kommentierte) Tag oder <tag>-<n>-g<shortened sha-1>wenn nicht, wo <n>seit Anzahl von Commits ist <tag>.
Jakub Narębski
1
@ Jakub - Danke. Ich --exact-matchhabe meine Antwort Sekunden vor Ihrem Kommentar hinzugefügt . Gut zu wissen, dass Sie es entfernen und trotzdem gute Informationen von unschärferen Eingaben erhalten können.
Bstpierre
Danke, genau das habe ich gesucht. Übrigens funktioniert sogar git-description --exact-match (ohne --tags) für mich.
Gramm
3
Verwenden git rev-parse HEADist eine bessere Lösung als git log -n1 --pretty='%h'... aber warum können Sie nicht einfach schreiben HEAD(oder nichts, git describestandardmäßig HEAD)?
Jakub Narębski
nur Guybrush hasst Porzellan
vdegenne
71

Das hat bei mir funktioniert git describe --tags --abbrev=0

MK
quelle
2
Ja. Dies funktioniert auch, wenn Sie nicht genau auf diesem Tag sind! :)
Martin Muzatko
13
Uhhh. ... Wenn Sie den Hash drei Commits nach dem Tag auschecken, befinden Sie sich nicht "auf diesem Tag". Es zeigt Ihnen das letzte Tag vor oder beim Festschreiben, das ausgecheckt wurde. Das ist also falsch.
Ingyhere
Funktioniert auch unter Windows :)
Cowlinator
49

Alle Tags auf dem aktuellen HEAD anzeigen (oder festschreiben)

git tag --points-at HEAD
George Pavelka
quelle
1
Beachten Sie, dass dieser Befehl keinen Fehler in der Befehlszeile meldet, selbst wenn das Ergebnis leer ist. Fehler? Es wird auch eine Liste zurückgegeben, wenn sich an diesem Speicherort mehrere Tags befinden. Es ist die beste Antwort, aber Skripter sollten mit Vorsicht vorgehen und diese Vorbehalte berücksichtigen.
Ingyhere
Nach dem Kommentar von @ ingyhere. Ja, es ist eine gute Information, dass es keinen Fehler gibt und die Leute das Ergebnis entsprechend behandeln müssen. Aber ich würde es nicht als Fehler bezeichnen. In meinem Fall ist "leer, wenn keine Tags vorhanden" gültig. In anderen Fällen kann jemand es in einer Variablen speichern und dann prüfen, ob es leer ist (Link zu Bash-Anweisungen)
Driftcatcher
23

git describeist ein Porzellanbefehl , den Sie vermeiden sollten:

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatic.html

Stattdessen habe ich verwendet:

git name-rev --tags --name-only $(git rev-parse HEAD)
Greg
quelle
11
Es kehrt "undefiniert" zurück
Fremder
4
Dies gibt ein Trailing ^0für Commits aus, die Tags entsprechen (z. B. für Tags 1.0, die ausgegeben werden 1.0^0). Gibt es eine Möglichkeit, nur Git-Ausgabe zu haben 1.0, oder sollte ich dafür sed verwenden?
Daniel Serodio
13
Nur ein paar konzeptionelle Probleme: Ich denke, Sie haben die Bedeutung von Porzellan und Sanitär umgekehrt. Es ist in Ordnung, Porzellan zu verwenden, es ist hoch und für den normalen Gebrauch gedacht . Plumbing ist intern (wie der Name schon sagt) und wird nur nicht empfohlen, da sich die Git-Entwickler das Recht vorbehalten, ihre Argumente und Ausgaben ohne Vorwarnung zu ändern. Ihr erster Vorschlag ist also der etwas passendere.
Leo Antunes
5
Der verlinkte Artikel sagt, dass die Verwendung von "Git Branch" vermieden werden soll, da dies für diesen Anwendungsfall nicht funktioniert. Ich kann mir keinen guten Grund vorstellen, die Beschreibung von git zu vermeiden. Wie Leo sagt, sind "Porzellan" -Befehle die Befehle, die Sie normalerweise verwenden sollten. Vermeiden Sie die Installationsbefehle, es sei denn, Sie wissen wirklich, was Sie tun. "git beschreiben" funktioniert super.
Danny
4
"Porzellan" -Befehle sollten Sie verwenden, nicht diejenigen, die Sie vermeiden sollten. Dies sind die Befehle, deren Ausgabe maschinenlesbar ist und sich in zukünftigen Versionen nicht ändern wird. Sie können daher in Skripten usw. verwendet werden. Befehle ohne Porzellan führen tendenziell zu einer besser lesbaren Ausgabe, können sich jedoch in zukünftigen Versionen ändern, z. B. um sie besser zu machen lesbar, nicht weil sich tatsächlich etwas Wichtiges geändert hat.
rjmunro
22

Wenn Sie ein Tag auschecken, haben Sie einen sogenannten "abgetrennten Kopf" . Normalerweise ist das HEAD-Commit von Git ein Zeiger auf den Zweig, den Sie gerade ausgecheckt haben. Wenn Sie jedoch etwas anderes als einen lokalen Zweig auschecken (z. B. ein Tag oder einen Remote-Zweig), haben Sie einen "abgetrennten Kopf" - Sie befinden sich nicht wirklich in einem Zweig. Sie sollten keine Commits machen, während Sie sich auf einem abgetrennten Kopf befinden.

Es ist in Ordnung, ein Tag auszuchecken, wenn Sie keine Änderungen vornehmen möchten. Wenn Sie nur den Inhalt von Dateien untersuchen oder Ihr Projekt aus einem Tag erstellen möchten, ist es in Ordnung, git checkout my_tagmit den Dateien zu arbeiten, solange Sie keine Commits vornehmen . Wenn Sie mit dem Ändern von Dateien beginnen möchten, sollten Sie einen Zweig basierend auf dem Tag erstellen:

$ git checkout -b my_tag_branch my_tag

erstellt einen neuen Zweig namens my_tag_branchab my_tag. Es ist sicher, Änderungen in diesem Zweig zu übernehmen.

Mipadi
quelle
1
Fantastische Antwort.
Panos Filianos
9

git log --decorate

Hier erfahren Sie, welche Refs auf das aktuell ausgecheckte Commit verweisen.

chriswatrous
quelle