Git tags, releases and changelog: Publishing versions cleanly
In short: Tags mark certain commits as a version, releases bundle them with explanations and files, and a changelog describes for users what has changed.
In more detail: A software version is a uniquely named state of the code. For this you use Git tags, version numbers (SemVer) and release notes.
In Depth
Tags
git tag v1.4.0 # lightweight tag
git tag -a v1.4.0 -m "Version 1.4.0" # annotated tag (with author, date, message)
git push origin v1.4.0 # publish tag (tags are not pushed automatically)
git tag -l 'v1.*' # list tags
git checkout v1.4.0 # look at this state
git tag -d v1.4.0 # delete locallyTags are immutable markers (do not move them once published). For releases use annotated (and possibly signed, -s) tags.
Version numbers
Semantic versioning: MAJOR.MINOR.PATCH (for example 2.3.1): MAJOR for incompatible changes, MINOR for new, compatible features, PATCH for bug fixes. Pre-releases: 2.0.0-beta.1. Alternative CalVer (2026.03). The number appears in the tag, package file (package.json, pyproject.toml) and release.
Releases and changelog
On GitHub/GitLab a release creates from a tag a page with description, download files (artifacts) and automatically generated notes. A CHANGELOG.md (format “Keep a Changelog”) is structured by version into Added, Changed, Deprecated, Removed, Fixed, Security and addresses users, not developers (do not simply paste the commit list). With Conventional Commits and tools (release-please, semantic-release, changesets) versions and changelog can be produced automatically.
Procedure and tips
- Tests green, raise version, extend changelog.
- Commit, set tag, push.
- CI builds artifacts (packages, container images) and publishes (npm, PyPI, Docker registry), ideally reproducible and signed.
- Write release notes, clearly highlight breaking changes and give migration notes.
- On errors a new patch version instead of moving the tag. For websites a deployment per commit often suffices; tags/releases matter for libraries, apps and tools that others install.
See also: Semantic versioning, Conventional Commits, CI/CD pipeline, README file