Git Tag: Sort tags by semantic version / natural order

Sun, 2019-11-24 00:49

The git tag command lists all tags you have created in your repository. When creating a new version of a project that you are working on, using a command like npm version major|minor|patch is easier as it takes care of everything. For the rest of the projects, we still run git tag to quickly lookup the existing tags in the repository, so we can figure out the what the next version number should be.

By default, the git tag output is sorted alphabetically, and you can end up with lists like this:

v0.0.8
v0.1.0
v0.10.0
v0.10.1
v0.2.0
v0.20.0 <=- The latest release
v0.3.0 <=- Not the latest release

It can be a bit daunting to go through the list and find the latest version from the list. I was pleasantly surprised to discover the Git provides a feature to sort tags by version numbers.

You can run the following for the nicely sorted list of tags:

git tag --sort version:refname

This will output a properly sorted list, and the semantically latest version will be at the bottom of the list:

v0.0.8
v0.1.0
v0.2.0
v0.3.0
v0.10.0
v0.10.1
v0.20.0 <=- The latest release

You can get the list in reverse order as well, by prefixing a dash to the command:

git tag --sort -version:refname

Because it's cumbersome to type the sort option everytime, you can set this as a global Git configuration. It turns out tag.sort configuration precisely does that.

git config --global tag.sort -version:refname

From now on, when you type git tag, you will get a nicely sorted list of all your tags, sorted by their version numbers, and the latest version will be o the top of the list!