2010-08-04 7 views
122

Ich habe Probleme herauszufinden, welches Tag gerade ausgecheckt ist.Zeigen Sie, auf welchem ​​Git-Tag Sie sind?

Wenn ich tue:

git checkout tag1 
git branch 

Ich kann nicht scheinen, um herauszufinden, welchen Tag ich bin. Es protokolliert nur:

* (no branch) 
master 

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

Antwort

196

Bearbeiten: Jakub Narębski hat mehr git-fu. Die folgende viel einfacher Befehl funktioniert perfekt:

git describe --tags 

(oder ohne --tags, wenn Sie einen kommentierten Tag ausgecheckt haben Mein Tag ist leicht, also muss ich die --tags..)

ursprüngliche Antwort folgt:

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

Jemand mit mehr git-fu eine elegantere Lösung haben ...

Dies nutzt die Tatsache, dass git-log das Protokoll nach dem Auschecken meldet. %h druckt den abgekürzten Hash. Dann findet git describe --exact-match --tags das Tag (leichtgewichtig oder mit Anmerkungen versehen), das genau diesem Commit entspricht.

Die obige $() Syntax geht davon aus, dass Sie bash oder ähnliches verwenden.

+12

einfach mit 'git describe' Tag-Namen zeigen würde, wenn Sie genau auf sind (kommentierte) Tag oder ' - -g ' wenn nicht, wobei '' die Anzahl der Commits seit ' 'ist. –

+1

@Jakub - Danke. Ich fügte meiner Antwort Sekunden vor dem Kommentar '--exact-match' hinzu. Schön zu wissen, dass Sie es entfernen können und immer noch gute Infos von unschärferer Eingabe bekommen. – bstpierre

+0

Danke, das war genau das, was ich gesucht habe. Btw, sogar git-describe --exact-match (ohne --tags) funktioniert bei mir. – grm

18

Wenn Sie ein Tag auschecken, haben Sie eine sogenannte "detached head". Normalerweise ist das HEAD-Commit von Git ein Zeiger auf den Zweig, den Sie gerade ausgecheckt haben. Wenn Sie jedoch etwas anderes als eine lokale Zweigstelle (z. B. ein Tag oder eine entfernte Zweigstelle) auschecken, haben Sie einen "abgetrennten Kopf" - Sie befinden sich nicht wirklich in einem Zweig. Du solltest keine Commits machen, während du auf einem abgetrennten Kopf stehst.

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, können Sie git checkout my_tag verwenden und mit den Dateien arbeiten, solange Sie keine Commits machen. Wenn Sie Modifizieren von Dateien beginnen möchten, sollten Sie einen Zweig erstellen, die auf dem Tag basiert:

$ git checkout -b my_tag_branch my_tag 

wird erstellen Sie einen neuen Zweig namens my_tag_branch von my_tag beginnen. Es ist sicher, Änderungen in diesem Zweig zu bestätigen.

18

git describe ein porcelain Befehl ist, die Sie vermeiden sollten:

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

Stattdessen habe ich:

git name-rev --tags --name-only $(git rev-parse HEAD) 
+5

Es gibt "undefined" zurück – Stranger

+3

Es wird ein abschließendes '^ 0' für Commits ausgegeben, die Tags entsprechen (zB für Tag' 1.0' gibt es '1.0^0' aus). Gibt es eine Möglichkeit, Git nur '1.0' ausgeben zu lassen, oder sollte ich sed dafür benutzen? –

+0

@DanielSerodio das funktionierte für mich in bash mit sed installiert: 'git name-rev --tags --name-only $ (git rev-parse HEAD) | sed's | \ ([^ \ ^] * \) \ (\^0 \) $ | \ 1 | g'' – hobs

7

git log --decorate

Dies wird Ihnen sagen, was Refs zeigen auf das aktuell ausgecheckte Commit.

24

Dieser arbeitete für mich git describe --tags --abbrev=0

+1

Der einzige, der funktioniert hat! Danke –

+0

Ja. das funktioniert auch, wenn Sie nicht genau auf diesem Tag sind! :) –

+2

Uhhh. ... Wenn Sie den Hash drei Commits nach dem Tag auschecken, sind Sie nicht "auf diesem Tag". Es teilt Ihnen das letzte Tag vor oder bei dem ausgecheckten Commit mit. Das ist also falsch. – ingyhere

17

anzeigen Alle Tags zu aktuellen HEAD (oder begehen)

git tag --points-at HEAD 
+0

Beachten Sie, dass dieser Befehl keinen Fehler in der Befehlszeile meldet, auch wenn das Ergebnis leer ist. Fehler? Es gibt auch eine Liste zurück, wenn an diesem Ort mehrere Tags vorhanden sind. Es ist die beste Antwort, aber Scripter sollten mit Vorsicht vorgehen und diese Einschränkungen beachten. – ingyhere