Semantic Versioning
There really is no reason to look any futher than
Semantic Versioning 2.0.0.
In broad terms, SEMVER advocates dividing the version tag into three parts: MAJOR.MINOR.PATCH. The scope of an update to the production code should be reflected in the delta between the previous and new version. E.g. a bug fix will generally correspond to a software patch and would be indicated with X.X.X -> X.X.X+1.
Helpful tools
Bumpversion is a nice tool to automate the process of updating the version of your software. It’s written in Python but is otherwise language agnostic.
For a general Python project the basic configuration file would reside in the root of the project and look something like this:
[bumpversion]
current_version = 0.0.1
commit = True
tag = True
[bumpversion:file:my_package/VERSION]