๐Ÿค–Save up to $132K/month in CI costs!Try Freeโ†’
Skip to main content

Understanding Git Tags and Checkout

6 min read
DevOps Engineer, Former Frontend Engineer ๐Ÿ”ง
My focus is on automating workflows and making sure CI/CD pipelines run like a well-oiled machine.

This article was last updated on January 23, 2025, to include advanced techniques for managing Git tags, such as handling tag conflicts, automating tag creation in CI/CD pipelines, and implementing semantic versioning strategies, along with simplified explanations to enhance clarity.

TL;DR

What are Git tags?
Think of Git tags like sticky notes in a cookbook - they mark important versions of your recipe (code) that you want to remember and come back to later.

Why use Git tags?

  • Mark release versions (v1.0.0, v2.0.0)
  • Easy rollback to known good states
  • Better version tracking than branches
  • Essential for release management

Introduction to Git Tags and Version Managementโ€‹

Having spent a large number of hours helping teams manage their Git repositories, I learn that, really, the unsung heroes for version control are the tags. I remember that day quite well when a deployment to production went awry-we rolled back to a stable state in minutes, not hours, because versions were tagged correctly.

Steps we'll cover:

Understanding Git Tags: A Complete Guideโ€‹

Click to zoom

Consider Git tags as bookmarks in your favorite book. While the branches are like the different drafts of your story, tags are the markers which say, "this version is important - remember it!" I learned that distinction the hard way when I was starting with Git. I had used branches for everything until one senior developer showed me how to make release management so much simpler with the use of tags.

Creating and Managing Git Tags Effectivelyโ€‹

Allow me to show you some basic tag commands I use every day:

Create a lightweight tag

git tag v1.0.0

Create an annotated tag (recommended)

git tag -a v1.0.0 -m "Release version 1.0.0"

List all tags

git tag -l

Pro Tip: I use annotated tags for releases. They're like leaving a detailed note to your future self, or to your teammates, for why this is an important version.

Working with Remote Git Tagsโ€‹

Here's a gotcha that got me when I first started: tags don't automatically push to remote repositories! Here's how to handle them:

Push a specific tag

git push origin v1.0.0

Push all tags

git push origin --tags

Delete a remote tag

git push origin :refs/tags/v1.0.0

Git Tag Best Practices for Version Controlโ€‹

After having broken things a few times (ok, more than a few), here's what I've learned:

Semantic Versioning in Git Tags

Semantic versioning helps your team understand the impact of each release at a glance. The format MAJOR.MINOR.PATCH tells everyone whether a change is breaking (MAJOR), adds features (MINOR), or just fixes bugs (PATCH). This clarity is invaluable when managing dependencies and planning upgrades.

Good semantic versioning example

git tag -a v1.2.3 -m "Feature release with bug fixes"

Not so good semantic versioning example

git tag -a final_version -m "The final version"

Always add messages to an annotated tag; Tag messages are the commit messages of releases. They provide critical context about what changed and why. Detailed tag messages save hours of detective work when investigating production issues or planning upgrades.

Good tag message example

git tag -a v1.0.0 -m "Initial stable release with login feature"

Not so good tag message example

git tag -a v1.0.0

Git Tags vs Brancheeโ€‹

AspectGit TagsGit Branches
PurposeMarks a specific commit or version.Represents ongoing development.
ImmutabilityImmutable once created - can be forced to update.Mutable and can change over time.
UsageFor releases, versioning, and rollbacks.For active development and feature work.
ScopePoints to a single commit.Tracks a sequence of commits.
PushingRequires explicit push (git push origin --tags).Automatically pushed with git push.
RollbackEasy to rollback to a tag.More complicated to identify a stable state.

Common Git Tag Problems and Solutionsโ€‹

Resolving Conflicts in Git - Tagsโ€‹

Most often, tag conflicts occur when multiple team members attempt to tag the same release or during syncing with remote repositories. Even though Git won't let you accidentally overwrite an existing tag, with hotfixes or correcting tags that were placed on the wrong point, you do need to force an update of the tag sometimes.

Try to create a tag

git tag v1.0.0

Solution: Force update if you're sure

git tag -f v1.0.0

Fixing Incorrectly Created Tagsโ€‹

We all make mistakes, and sometimes tags end up pointing to the wrong commits. Fortunately, Git won't keep you awake at night worrying about them; it's fairly easy to fix mistakes like this. In the future, when you do push a corrected tag, be sure to communicate clearly with your team what you're doing. Others may have already based work on that tag.

Delete the wrong tag

git tag -d wrong_tag

Create the correct one

git tag -a correct_tag -m "This is the right version"

Advanced Git Tag Techniques for CI/CDโ€‹

How it works: there is this one cool trick that I use inside of our CI/CD pipeline in order to automatically tag releases.

Get the latest version and increment it

LATEST_TAG=$(git describe --tags --abbrev=0)
NEW_TAG=$(echo $LATEST_TAG | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g')
git tag -a $NEW_TAG -m "Automatic release $NEW_TAG"

Conclusionโ€‹

Git tags seem pretty simple but are incredibly powerful if used right. They have saved my team a lot of time in release management and deployment rollbacks.

Remember: branches are for active development; tags are created for marking very important moments in your repository. You know, like taking a snapshot of your code at the best moments!