Let\'s imagine the blerp command line tool maintained on git. This tool has the (hidden) --version
option which returns its version (let\'s say 0.1.2
Revision numbers should be maintained by you, not by git. As, opposed to SVN, you don't have a incremental revision number growing on each commit, there's no way out of the box to git to contextualize what your version is.
Alexey Kiselev and Dario already hinted towards the answer, but I will try to explain it in detail.
There are two types of versioning schemes:
People use different schemes as per their need, but semantic versioning is fairly widely used and authored by Tom Preston-Werner, co-founder of GitHub.
Semantic versioning follows the pattern of X.Y.Z
Or more readable would be [major].[minor].[patch]-[build/beta/rc]
E.g. 1.2.0-beta
major or X
can be incremented if there are major changes in software, like backward-incompatible API release.
minor or Y
is incremented if backward compatible APIs are introduced.
patch or Z
is incremented after a bug fix.
By using tags:
Tags in Git can be used to add a version number.
git tag -a "v1.5.0-beta" -m "version v1.5.0-beta"
adds a version tag of v1.5.0-beta to your current Git repository. Every new commit after this will auto-increment tag by appending commit number and commit hash. This can be viewed using the git describe
command.
v1.5.0-beta-1-g0c4f33f
here -1-
is the commit number and 0c4f33f
the abbreviation of commit's hash. The g
prefix stands for "git"
.
Complete details can be viewed using:
git show v1.5.0-beta
As you say, versioning issues are usually solved in git using branch
and tags
(like semantic versioning pattern).
The better way is to use git
to track only changes in the codebase, ignoring (using .gitignore file) builds files and maintaining a clean repository.
Builds results (pre/compiled files, executables files, distribution files, zips, exe...) could depend of environments variables (platform, system arch, etc) and should be keep separate in a registry.
If the codebase very big and hard to maintain, maybe you should considerate to divide it in smaller components (or git submodule) to avoid cross-dependencies at development time.
Please, have a look at git describe command. This command shows you the latest tag and an amount of commits made after the tag was set. It also possible to show the dirtiness of the repository.
As you mentioned this command wouldn't work without the git repository (.git folder) and git installed. But it's almost unimaginable developer today without git but with all other tools installed.