Tags
A very useful aspect of Git is the ability to mark any commit with additional information. This is called a “tag” and can be used as a form of marker.
Creating a tag is a simple CLI command:
git tag v0.9.0
This attached the tag to the last commit. This is important since the tag won't include any files that have changed but have not be committed. On a forge this will show up on the tags page and commit graph.
As important note is that Git does not automatically push tags to the remote repository. Instead, you need to push them separately.
git push --tags
Alternatively, you could create a Just target to push both at the same time which would allow just push
to do everything.
push:
git push
git push --tags
As a note, the tag names must be unique. So you can't have two v0.0.1
tags.
Internals
Internally, a tag is just a pointer to a specific commit. Once set, it remains pointing to that specific commit but allows you to have a symbolic name, such as v0.9.0
, instead of the internal identifier, such as ad301ac018
.
Versioning
While versioning is a more advanced topic, I found the most common use of a tag is identify the project at a certain point as a specific version.
Major Changes
Another use for tags is to identify when you started or stopped working on a major refactor. In this case, you could call git tag before-chapter-10-rewrite
, do a bunch of commits and changes, and then end with a git tag after-chapter-10 rewrite
. That way, you don't have to do everything in a single commit (“commit early and often”) but still know you were doing a major change.
This can also be done with a branch but tags are considerably more lightweight and easier than branches, though branches are more flexible.
Readers and Editors
Another use of tags is the ability to identify when you gave a copy of the project to a reader. That way, you don't have to remember if you continued to edit the piece while they were reading (I've had readers take 2-3 months to finish).
These days, I use branches exclusively for this but I started with using tags.
git tag sent-to-bob