Here's a fun one for a certain set of use cases. If your repository has versions such as v1.0.0
, v1.1.0
, v1.1.1
etc, and also shorthand versions such as v1
that point to whatever is the latest v1.x.x
, the following will give you a reference to the currently-checked-out commit in relation to the most recent fully versioned tag, with fallbacks if that doesn't work:
git describe --tags --exact-match --match "v*.*.*" \
|| git describe --match "v*.*.*" --tags \
|| git describe --tags \
|| git rev-parse HEAD
So let's say you have the following commits:
* 4444444 (main, origin/main, tag: v2.0.0, tag: v2.0, tag: v2)
* 3333333
* 2222222 (tag: v1.1.0, tag: v1.1, tag: v1)
* 1111111 (tag: v1.0.0, tag: v1.0)
* 0000000
Output of the above command for a few example HEADs:
git checkout main
-> v2.0.0
git checkout 3333333
-> v1.1.0-1-g3333333
git checkout 2222222
-> v1.1.0
git checkout v1
-> v1.1.0
git checkout 0000000
-> 0000000
(full ref)