NAME

git-describe - Give an object a human readable name based on an available ref

SYNOPSIS

  1. git describe [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>…​]
  2. git describe [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]
  3. git describe <blob>

DESCRIPTION

The command finds the most recent tag that is reachable from acommit. If the tag points to the commit, then only the tag isshown. Otherwise, it suffixes the tag name with the number ofadditional commits on top of the tagged object and theabbreviated object name of the most recent commit. The resultis a "human-readable" object name which can also be used toidentify the commit to other git commands.

By default (without —all or —tags) git describe only showsannotated tags. For more information about creating annotated tagssee the -a and -s options to git-tag[1].

If the given object refers to a blob, it will be describedas <commit-ish>:<path>, such that the blob can be foundat <path> in the <commit-ish>, which itself describes thefirst commit in which this blob occurs in a reverse revision walkfrom HEAD.

OPTIONS

  • …​
  • Commit-ish object names to describe. Defaults to HEAD if omitted.

  • —dirty[=]

  • —broken[=]
  • Describe the state of the working tree. When the workingtree matches HEAD, the output is the same as "git describeHEAD". If the working tree has local modification "-dirty"is appended to it. If a repository is corrupt and Gitcannot determine if there is local modification, Git willerror out, unless ‘—broken’ is given, which appendsthe suffix "-broken" instead.

  • —all

  • Instead of using only the annotated tags, use any reffound in refs/ namespace. This option enables matchingany known branch, remote-tracking branch, or lightweight tag.

  • —tags

  • Instead of using only the annotated tags, use any tagfound in refs/tags namespace. This option enables matchinga lightweight (non-annotated) tag.

  • —contains

  • Instead of finding the tag that predates the commit, findthe tag that comes after the commit, and thus contains it.Automatically implies —tags.

  • —abbrev=

  • Instead of using the default 7 hexadecimal digits as theabbreviated object name, use digits, or as many digitsas needed to form a unique object name. An of 0will suppress long format, only showing the closest tag.

  • —candidates=

  • Instead of considering only the 10 most recent tags ascandidates to describe the input commit-ish considerup to candidates. Increasing above 10 will takeslightly longer but may produce a more accurate result.An of 0 will cause only exact matches to be output.

  • —exact-match

  • Only output exact matches (a tag directly references thesupplied commit). This is a synonym for —candidates=0.

  • —debug

  • Verbosely display information about the searching strategybeing employed to standard error. The tag name will stillbe printed to standard out.

  • —long

  • Always output the long format (the tag, the number of commitsand the abbreviated commit name) even when it matches a tag.This is useful when you want to see parts of the commit object namein "describe" output, even when the commit in question happens to bea tagged version. Instead of just emitting the tag name, it willdescribe such a commit as v1.2-0-gdeadbee (0th commit since tag v1.2that points at object deadbee…​.).

  • —match

  • Only consider tags matching the given glob(7) pattern,excluding the "refs/tags/" prefix. If used with —all, it alsoconsiders local branches and remote-tracking references matching thepattern, excluding respectively "refs/heads/" and "refs/remotes/"prefix; references of other types are never considered. If givenmultiple times, a list of patterns will be accumulated, and tagsmatching any of the patterns will be considered. Use —no-match toclear and reset the list of patterns.

  • —exclude

  • Do not consider tags matching the given glob(7) pattern, excludingthe "refs/tags/" prefix. If used with —all, it also does not considerlocal branches and remote-tracking references matching the pattern,excluding respectively "refs/heads/" and "refs/remotes/" prefix;references of other types are never considered. If given multiple times,a list of patterns will be accumulated and tags matching any of thepatterns will be excluded. When combined with —match a tag will beconsidered when it matches at least one —match pattern and does notmatch any of the —exclude patterns. Use —no-exclude to clear andreset the list of patterns.

  • —always

  • Show uniquely abbreviated commit object as fallback.

  • —first-parent

  • Follow only the first parent commit upon seeing a merge commit.This is useful when you wish to not match tags on branches mergedin the history of the target commit.

EXAMPLES

With something like git.git current tree, I get:

  1. [torvalds@g5 git]$ git describe parent
  2. v1.0.4-14-g2414721

i.e. the current head of my "parent" branch is based on v1.0.4,but since it has a few commits on top of that,describe has added the number of additional commits ("14") andan abbreviated object name for the commit itself ("2414721")at the end.

The number of additional commits is the numberof commits which would be displayed by "git log v1.0.4..parent".The hash suffix is "-g" + unambiguous abbreviation for the tip commitof parent (which was 2414721b194453f058079d897d13c4e377f92dc6).The "g" prefix stands for "git" and is used to allow describing the version ofa software depending on the SCM the software is managed with. This is usefulin an environment where people may use different SCMs.

Doing a git describe on a tag-name will just show the tag name:

  1. [torvalds@g5 git]$ git describe v1.0.4
  2. v1.0.4

With —all, the command can use branch heads as references, sothe output shows the reference path as well:

  1. [torvalds@g5 git]$ git describe --all --abbrev=4 v1.0.5^2
  2. tags/v1.0.0-21-g975b
  1. [torvalds@g5 git]$ git describe --all --abbrev=4 HEAD^
  2. heads/lt/describe-7-g975b

With —abbrev set to 0, the command can be used to find theclosest tagname without any suffix:

  1. [torvalds@g5 git]$ git describe --abbrev=0 v1.0.5^2
  2. tags/v1.0.0

Note that the suffix you get if you type these commands today may belonger than what Linus saw above when he ran these commands, as yourGit repository may have new commits whose object names begin with975b that did not exist back then, and "-g975b" suffix alone may notbe sufficient to disambiguate these commits.

SEARCH STRATEGY

For each commit-ish supplied, git describe will first look fora tag which tags exactly that commit. Annotated tags will alwaysbe preferred over lightweight tags, and tags with newer dates willalways be preferred over tags with older dates. If an exact matchis found, its name will be output and searching will stop.

If an exact match was not found, git describe will walk backthrough the commit history to locate an ancestor commit whichhas been tagged. The ancestor’s tag will be output along with anabbreviation of the input commit-ish’s SHA-1. If —first-parent wasspecified then the walk will only consider the first parent of eachcommit.

If multiple tags were found during the walk then the tag whichhas the fewest commits different from the input commit-ish will beselected and output. Here fewest commits different is defined asthe number of commits which would be shown by git log tag..inputwill be the smallest number of commits possible.

BUGS

Tree objects as well as tag objects not pointing at commits, cannot be described.When describing blobs, the lightweight tags pointing at blobs are ignored,but the blob is still described as <committ-ish>:<path> despite the lightweighttag being favorable.

GIT

Part of the git[1] suite