Git Describe: Ref-Based Human-Readable Names
Use git describe to derive human-readable names for commits from tags or other refs, with precise candidate and dirty-working-tree controls.
Advanced
Learner goal
By the end of this lesson, you should be able to explain what `git describe` names, understand how Git selects candidate tags or refs, distinguish annotated-tag defaults from `--tags` and `--all`, interpret distance and abbreviated-object output, and use `--dirty` when reporting a working-tree state.
What `git describe` produces
`git describe` finds a name for an object by walking backward from that object and using a suitable ref, normally an annotated tag reachable from the target. When the target is not exactly at the selected tag, the result can contain the tag name, the number of commits since that tag, and an abbreviated object name.
git describe HEADQuick check
What question does `git describe HEAD` answer?
Create an annotated tag before several commits.git describe HEAD
Exact tag versus commits after a tag
If the target itself is exactly at the selected tag, the description can simply be the tag name. If commits have been added after the tag, Git reports the tag followed by the number of commits since it and an abbreviated object identifier for the target.
git describe release-1.0
git describe HEADThe commit count is not a count of all commits in the repository. It describes the distance from the selected tag to the target under the traversal rules used by `git describe`.
Quick check
What does the numeric component in a result such as `release-1.0-2-gabc1234` represent?
Have an annotated tag followed by two commits.git describe HEAD
Which tags are candidates?
By default, `git describe` considers annotated tags. `--tags` tells it to consider lightweight tags as well. This is different from the existing tag-creation lessons: the option changes which refs are eligible as naming candidates; it does not convert or modify any tag.
git describe HEAD
git describe --tags HEADQuick check
What does `--tags` change?
Create both an annotated and a lightweight tag in a disposable repository.Compare `git describe HEAD` with `git describe --tags HEAD`.
Using all refs with `--all`
`--all` tells `git describe` to use any ref found under `refs/`, rather than limiting candidates to tags. For example, a branch ref can become the descriptive name when it is the appropriate candidate.
git describe --all HEADThis is a naming operation, not a claim that a branch is a release tag. The resulting name reflects the ref namespace Git selected.
Quick check
What does `--all` broaden?
Create a branch pointing at the target and inspect the description.git describe --all HEAD
Reporting a dirty working tree
`--dirty` appends a dirty marker when the working tree has local modifications. This makes a generated version string distinguish a checked-out commit from the same commit when local working-tree changes are present.
git describe --tags --dirtyThe marker reports working-tree dirtiness; it does not identify or summarize the modified files. Use status or diff commands when you need that separate information.
A precise workflow
When using `git describe` for a release or build identifier, first decide what object you are naming, then decide whether the default annotated-tag candidates are appropriate. Add `--tags` only when lightweight tags should participate, or `--all` when any ref may participate. Add `--dirty` only when the working-tree state belongs in the identifier.
git describe --tags --dirty HEADQuick check
Which statement stays within the documented purpose of `git describe`?
What this command does not do
`git describe` does not create, move, delete, or verify tags. It does not change commits or refs. It also does not replace `git status` or `git diff` when you need a detailed account of working-tree changes.
Practice what you learned
Use the dedicated Git code-completion exercise for this lesson.
Official source boundary
This lesson uses the official Git `git-describe` documentation and the official tag/ref model already established by the curriculum. No third-party documentation is used for command semantics.
Thanks for your feedback.
Mark this learning resource complete to track your learning progress.