Wie erkennt man, auf welches Commit ein Tag in Git verweist?

409

Ich habe eine Reihe von nicht kommentierten Tags im Repository und möchte herausfinden, auf welches Commit sie verweisen. Gibt es einen Befehl, der nur die Tags und ihre Commit-SHAs auflistet? Das Auschecken des Tags und das Betrachten des KOPFES scheint mir etwas zu mühsam.

Aktualisieren

Nachdem ich die Antworten durchgesehen hatte, wurde mir klar, dass ich eigentlich nur die Geschichte vor dem Tag betrachten wollte, was git log <tagname>ausreicht.

Die Antwort, die als Antwort markiert ist, ist nützlich, um eine Liste der Tags und ihrer Commits zu erhalten, was ich gefragt habe. Ich bin mir sicher, dass es mit ein bisschen Shell-Hackery möglich ist, diese in SHA + Commit-Nachrichten umzuwandeln.

Igor Zevaka
quelle
3
Ich möchte darauf hinweisen, dass git show-refsha des Tags und nicht sha der Repo-Revision angezeigt wird. $ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD ist jetzt bei c7f8831 ... $ git checkout 08b9c77 HEAD ist jetzt bei c7f8831 ...
Konstantin Pelepelin
Wenn Ihre Tags mit Anmerkungen versehen sind, benötigen Sie--dereference
Trevor Boyd Smith

Antworten:

347

Ein Weg, dies zu tun, wäre mit git rev-list. Im Folgenden wird das Commit ausgegeben, auf das ein Tag verweist:

$ git rev-list -n 1 $TAG

Sie können es als Alias ​​hinzufügen, ~/.gitconfigwenn Sie es häufig verwenden:

[alias]
  tagcommit = rev-list -n 1

Und dann nenne es mit:

$ git tagcommit $TAG
Mipadi
quelle
30
Warum nicht verwenden git rev-parse <tag>? Oder git rev-list -1 <tag>?
Jakub Narębski
51
@ Jakub: git rev-parse $TAGGibt den SHA1 des Tag-Objekts zurück, nicht das Commit, auf das es zeigt. git rev-list -1funktioniert aber.
Mipadi
11
@mipadi: Für nicht kommentierte Tags spielt es keine Rolle; Für kommentierte Tags können Sie kommentierte / signierte Tags verwenden git rev-parse $TAG^{commit}oder git rev-parse $TAG^{}dereferenzieren
Jakub Narębski
5
Sie können verwenden:git rev-list $TAG --max-count=1
b73
4
@RobinHsu: Wenn Sie mit Anmerkungen versehene Tags haben, die mit git tag -aoder erstellt git tag -swurden git rev-parse <tag>, erhalten Sie SHA-1 eines Tag-Objekts selbst, während git rev-list -1 <tag>SHA-1 Commit (Revision) angezeigt wird , auf das es verweist, genau wie git rev-parse <tag>^{commit}. HTH.
Jakub Narębski
239
git show-ref --tags

git show-ref --abbrev=7 --tagsZeigt Ihnen beispielsweise Folgendes:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
CB Bailey
quelle
Vielen Dank dafür, dies verbirgt tatsächlich die Semantik des Betrachtens von entweder .git/packed-refsoder.git/refs/tags/*
Igor Zevaka
3
Hmmm. Es hat ein seltsames Verhalten in meinem Repository: Git-Tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; siehe Jakub Narebskis Antwort
NickSoft
6
das funktioniert, obwohl ich mich frage, ob es nicht sinnvoll wäre, sie auch zu git tag --verbosezeigen?
Unpolarität
34
Dies zeigt die Referenz des Tags selbst an, nicht das Commit, auf das das Tag zeigt. Sie müssen das -dFlag hinzufügen , um das referenzierte Commit zu erhalten (in einer zweiten Zeile).
Old Pro
4
@CharlesBailey, fair genug, aber die Frage und die Antworten haben sich dahingehend verändert, dass sie kommentierte Tags enthalten, und die Tatsache, dass git show-refsich die beiden verschiedenen Arten von Tags unterschiedlich verhalten, ist nicht offensichtlich oder allgemein bekannt.
Old Pro
104

Benutz einfach git show <tag>

Es werden jedoch auch Dumps-Commit-Diffs ausgegeben. Verwenden Sie, um diese Unterschiede wegzulassen git log -1 <tag>. (Danke an @DolphinDream und @demisx!)

Hlung
quelle
7
Wenn eine Frage auf SO viele verschiedene mögliche Antworten hat, werden die Antworten, die zuerst veröffentlicht werden, zuerst positiv bewertet. Sie werden ganz oben auf die Liste gesetzt und erhalten später mehr positive Antworten. Dies ist eine Vorspannungsschleife, die auf der Reaktionsgeschwindigkeit über der Reaktionsqualität basiert. Mit ausreichender Vorstellungskraft konnte dieses Problem behoben werden.
Samthebest
6
"Beste Lösung" für was? Wenn das Interesse daran besteht, die SHA eines Commits herauszufinden, zeigt das Tag auf "git show <mytag>" NICHT die beste Lösung. Dieser Befehl zeigt den gesamten Diff an, den das Commit einführt. Um nur die SHA des Commits aufzulisten, zeigt das Tag auf "git rev-list <mytag> -n 1". Dies ist die richtige Lösung.
DolphinDream
Dies ist nicht die Antwort auf die Frage des OP. git show <tag>zeigt den Unterschied, nicht das Commit, auf das das Tag zeigt.
Demisx
@demisx Wovon redest du? Es zeigt definitiv den Commit-Hash zusammen mit Tagger, Datum und anderen Informationen. Versuch es.
Hlung
4
@Hlung Wie @DolphinDream betonte, werden git showviel mehr Dinge auf den Bildschirm geworfen , die nicht vorhanden sein müssen. Es verdeckt den tatsächlichen Commit-Hash, den man sucht. Ein besserer Befehl ist git log -1 [tag-name]oder git log -1 --pretty=oneline [tag-name]wenn Sie Oneliner wollen.
Demisx
40

git show-ref TAGZeigt in meinem Repository den Hash des Tags an, nicht den Hash des Commits, auf das es verweist.

git show-ref --dereference TAG zeigt zusätzlich das Commit, auf das hingewiesen wird.

orip
quelle
34

Von Igor Zevaka :

Zusammenfassung

Da es ungefähr 4 fast gleich akzeptable und dennoch unterschiedliche Antworten gibt, werde ich all die verschiedenen Möglichkeiten zusammenfassen, ein Tag zu häuten.

  1. git rev-list -1 $TAG( Antwort ). git rev-listgibt die Commits aus, die zu $TAGähnlichem führen, git logaber nur den SHA1 des Commits anzeigen. Das -1begrenzt die Ausgabe auf das Commit, auf das es zeigt.

  2. git show-ref --tags( Antwort ) zeigt alle Tags (lokal und von der Fernbedienung abgerufen) und ihre SHA1s an.

  3. git show-ref $TAG( Antwort ) zeigt das Tag und seinen Pfad zusammen mit dem SHA1 an.

  4. git rev-parse $TAG( Antwort ) zeigt den SHA1 eines nicht kommentierten Tags an.

  5. git rev-parse --verify $TAG^{commit}( Antwort ) zeigt eine SHA1 mit und ohne Anmerkungen. Unter Windows verwenden git rev-parse --verify %TAG%^^^^{commit}(vier Hüte).

  6. cat .git/refs/tags/*oder cat .git/packed-refs( Antwort ) abhängig davon, ob das Tag lokal ist oder von der Fernbedienung abgerufen wird.

Benutzer456814
quelle
33

Verwenden

git rev-parse --verify <tag>^{commit}

(Dies würde SHA-1 eines Commits auch für kommentierte Tags zurückgeben).


git show-ref <tag>würde auch funktionieren, wenn <tag>nicht kommentiert wird. Und das gibt es immer git for-each-ref(Details siehe Dokumentation).

Jakub Narębski
quelle
11
Ich bevorzuge, git rev-parse <tag>~0was auch zu funktionieren scheint und unter Windows kein spezielles Escape erfordert (bei dem vier Hüte (^) anstelle von einem erforderlich sind). Das Suffix ~<number>gibt das <number> -te übergeordnete Commit an und ~0ergibt daher das Commit selbst. Übrigens ^0ist auch eine gültige Abkürzung für das ^{commit}Revisionssuffix.
Attila
15

Wie wäre es damit:

git log -1 $TAGNAME

ODER

git log -1 origin/$TAGNAME
Tuong Le
quelle
10

Um den sha / Hash des Commits zu erhalten, auf den sich ein Tag bezieht (nicht den sha des Tags):

git rev-list -1 <tag>

Daniel Little
quelle
8

Ich würde auch gerne den "richtigen" Weg kennen, aber in der Zwischenzeit können Sie dies tun:

git show mytag | head -1    
gahooa
quelle
Mit Commit-Titelgit show --oneline mytag | head -1
Stphane
7

Obwohl dies ziemlich alt ist, dachte ich, ich würde auf eine coole Funktion hinweisen, die ich gerade gefunden habe, um Tags mit Commits aufzulisten:

git log --decorate=full

Es werden die Zweige angezeigt, die bei einem Commit enden / beginnen, und die Tags für Commits.

Terrence Reilly
quelle
4

Sie können auch ein einfacher zu interpretierendes Bild davon erhalten, wo Tags verwendet werden

git log --graph |git name-rev --stdin --tags |less

und scrollen Sie dann zu dem Tag, nach dem Sie suchen /.

Eine kompaktere Ansicht ( --pretty=oneline) und alle Köpfe ( -a) könnten ebenfalls helfen:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Sieht ein bisschen furchterregend aus, könnte aber ~/.gitconfigbei Bedarf auch als Alias ​​verwendet werden.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Antony Hatchkins
quelle
4

Kurze Antwort nach Git-2

Ich weiß, dass diese Frage schon eine ganze Weile hier draußen ist. Und die Antwort von CB Bailey ist 100% richtig:git show-ref --tags --abbrev

Ich mag dieses besser, da es verwendet git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Einfach. Kurz.

PS alias es wie git taglistmit diesem Befehl:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"
Jesper Rønn-Jensen
quelle
3

In der Git-Mailingliste können Sie die Liste der Commit-Hashes für Tags mit automatischer Dereferenzierung für kommentierte Tags abrufen:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
anatoly techtonik
quelle
2

Hier werden die Dateinamen nicht angezeigt, aber zumindest erhalten Sie ein Gefühl für das Repository.

cat .git/refs/tags/*

Jede Datei in diesem Verzeichnis enthält einen Commit-SHA, der auf einen Commit verweist.

Peter Stuifzand
quelle
Das hat nicht funktioniert, da ich die Tags von der Fernbedienung gezogen habe. .git/packed-refshat aber funktioniert.
Igor Zevaka
2

Ich würde auch gerne den richtigen Weg kennen , aber Sie können immer einen Blick darauf werfen:

$ cat .git/packed-refs 

oder:

$ cat .git/refs/tags/*
miku
quelle
Richtig, das Verhalten für gepackte Refs und refs / Tags ist also etwas anders. Packed-refs ist eine Textdatei mit Tags und SHAs, während refs / tags / ein Verzeichnis mit Textdateien ist, die nach einem Tag benannt sind, das die SHA enthält. Ich denke tatsächlich, dass der richtige Weg, dies zu tun, mit ist git rev-list.
Igor Zevaka
2

Dadurch erhalten Sie den aktuellen SHA1-Hash

Abkürzung Commit Hash

git show <tag> --format="%h" --> 42e646e

Commit Hash

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Louis
quelle
1
scheint nicht in der Version zu funktionieren, die ich habe, aber es git log <tag> -n 1 --pretty=%Hfunktioniert
Andy
2

Wenn Sie die Details des Tags SOMETAG (Tagger, Datum usw.), den Hash des Commits, auf den es verweist, und einige Informationen zum Commit anzeigen möchten, aber ohne den vollständigen Unterschied, versuchen Sie es

git show --name-status SOMETAG

Beispielausgabe:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....
Avy Sharell
quelle
0

Ich habe also eine Menge Release-Ordner, in denen diese Ordner aus einem der wenigen verschiedenen Repos ausgecheckt werden können und aus Dev-, Qa- oder Master-Zweigen bestehen können oder aus Produktions-Releases, die aus einem Tag ausgecheckt wurden, und dem Tag kommentiert oder nicht. Ich habe ein Skript, das auf den Zielordner schaut und eine Antwort im Formular erhält -. Das Problem ist, dass verschiedene Versionen von git für einen Tag-Checkout einen unterschiedlichen Status zurückgeben.

Also fand ich git show-ref --tagsanfangs funktioniert, bis auf die mit Anmerkungen versehenen Tags. Durch Hinzufügen von -d wurde jedoch ein separater Eintrag zur Liste der Tags hinzugefügt, einer für das Tag und der andere für die Annotation (das Annotation-Commit wurde als ^ {} identifiziert, das ich mit sed entfernt habe).

Das ist also der Kern meines Skripts für alle, die es wollen:

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi
Sibaz
quelle
0

Kann unten verwenden, gibt es den Commit-Hash
git show -s --format=%H <tag>^{commit}

Wenn abgekürzter Commit-Hash erforderlich ist, git show -s --format=%h <tag>^{commit}

Reddysekhar Gaduputi
quelle