A tag marks one specific commit permanently — most commonly to record a release version, so "v1.0.0" always points to the exact commit that was actually shipped.
# A lightweight tag — just a name pointing to a commit
git tag v1.0.0
# An annotated tag — includes a message, author, and date (recommended for releases)
git tag -a v1.0.0 -m "First stable release"git tag
# v1.0.0
git show v1.0.0
# Shows the tag's message and the commit it points toTags aren't included in a normal git push — they need to be pushed explicitly.
git push origin v1.0.0
# Push every tag at once
git push origin --tagsgit checkout v1.0.0
# Same detached HEAD situation as checking out any specific commit —
# from the earlier HEAD lessonOn GitHub, a Release is a tag with release notes, and optionally downloadable files attached (a compiled binary, a build artifact) — created from a repository's "Releases" section, usually based on an existing tag.
| A plain Git tag | A GitHub Release |
|---|---|
| Just a name pointing to a commit | A tag, plus formatted release notes and optional file attachments |
| Works with any Git host, or no host at all | A GitHub-specific feature built on top of tags |
| git tag -a / git push origin | Created through GitHub's web interface or gh CLI |
Auto-generated release notes
GitHub can auto-generate release notes from the commits and merged PRs between two tags — a genuinely useful starting point that saves writing a changelog from scratch.