24

It is related to Making git show to show information in a machine parseable format but I am getting tired of the fact that I now have to do a lot of parsing to get the commit hash.

Can someone give me a command that will print the commit hash (and only the commit hash) tag for a given git tag? I was hoping

git show mylabel --pretty=format:"%H" --quiet 

Would just print me my commit # but it says

tag mylabel
Tagger: user <user@x.com>

Some comment

446a52cb4aff90d0626b8232aba8c40235c16245

I was expecting one line of output with just the commit line but I now have to parse for the last line?

Community
  • 1
  • 1
Kannan Ekanath
  • 16,759
  • 22
  • 75
  • 101
  • 1
    I think @michas' solution should be the accepted answer – Andy Jun 24 '16 at 22:03
  • 2
    Possible duplicate of [How to tell which commit a tag points to in Git?](https://stackoverflow.com/questions/1862423/how-to-tell-which-commit-a-tag-points-to-in-git) – 030 Jun 22 '19 at 12:58

5 Answers5

28

What about git log -1 --format=format:"%H" mylabel

EDIT:

Actually a better solution would be :

git show-ref -s mylabel

WARNING This only works for Unannotated tags For a more general and safer command see https://stackoverflow.com/a/1862542/1586965

EDIT bis: As mentioned in the comments, be careful with annotated commits (which are objects of their own). To have a more generic solution, read @michas answer.

You can see the difference when you do a git show-ref -d mylabel.


Resources:

samthebest
  • 30,803
  • 25
  • 102
  • 142
Colin Hebert
  • 91,525
  • 15
  • 160
  • 151
  • 1
    Be aware that this does NOT work for annotated tags, for which the tag is different from its commit. – michas May 29 '13 at 16:02
  • The `git log -1` is an useful option since I can play around with the format. However the git log command gives me the commit hash and commit name not the TAG's hash and the tagger. Is there any way I can find that using git-log? – Kannan Ekanath May 30 '13 at 09:54
  • This is going to show multiple things if there are also remote branches labeled `mylabel` – Andy Jun 24 '16 at 21:56
  • (which would interfere with scripting) – Andy Jun 24 '16 at 22:02
20

git help rev-parse says:

   <rev>^{}, e.g. v0.99.8^{}
       A suffix ^ followed by an empty brace pair means the object could be a tag, and dereference the tag recursively until a non-tag object is found.

Generally you use tag^{} to refer to that commit.

You have two different kind of tags:

  • lightweight tags are just pointers to an existing commit
  • annotated tags are objects on there own which contain a pointer to a separate commit object

Use git rev-parse tag to get the SHA1 of the tag itself.

Use git rev-parse tag^{} to get the SHA1 of the underlaying commit.

For lightweight tags both are the same. For annotated tags they are not.

You can also use git show-ref -d tag, which will show you both the SHA1 of the tag and the SHA1 of the associated commit.

There is also git show tag to give you details about an (annotated) tag.

michas
  • 25,361
  • 15
  • 76
  • 121
5

git rev-parse mylabel^{} should do what you want. See man gitrevisions for more info on ^{} and other operators.

Nevik Rehnel
  • 49,633
  • 6
  • 60
  • 50
5
git log <tag or branch> -1 --pretty=%H

-1: tells it to only print 1 commit

--pretty=%H: tells it to only print the full hash

Andy
  • 7,885
  • 5
  • 55
  • 61
-1

just a guess: try "git show --pretty=format:"%H" --quiet mylabel"

Markus Mikkolainen
  • 3,397
  • 18
  • 21