Documentation / git-tag.txton commit Git 1.8.5.1 (a155a5f)
   1git-tag(1)
   2==========
   3
   4NAME
   5----
   6git-tag - Create, list, delete or verify a tag object signed with GPG
   7
   8
   9SYNOPSIS
  10--------
  11[verse]
  12'git tag' [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>]
  13        <tagname> [<commit> | <object>]
  14'git tag' -d <tagname>...
  15'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>]
  16        [--column[=<options>] | --no-column] [<pattern>...]
  17        [<pattern>...]
  18'git tag' -v <tagname>...
  19
  20DESCRIPTION
  21-----------
  22
  23Add a tag reference in `refs/tags/`, unless `-d/-l/-v` is given
  24to delete, list or verify tags.
  25
  26Unless `-f` is given, the named tag must not yet exist.
  27
  28If one of `-a`, `-s`, or `-u <key-id>` is passed, the command
  29creates a 'tag' object, and requires a tag message.  Unless
  30`-m <msg>` or `-F <file>` is given, an editor is started for the user to type
  31in the tag message.
  32
  33If `-m <msg>` or `-F <file>` is given and `-a`, `-s`, and `-u <key-id>`
  34are absent, `-a` is implied.
  35
  36Otherwise just a tag reference for the SHA-1 object name of the commit object is
  37created (i.e. a lightweight tag).
  38
  39A GnuPG signed tag object will be created when `-s` or `-u
  40<key-id>` is used.  When `-u <key-id>` is not used, the
  41committer identity for the current user is used to find the
  42GnuPG key for signing.  The configuration variable `gpg.program`
  43is used to specify custom GnuPG binary.
  44
  45Tag objects (created with `-a`, `s`, or `-u`) are called "annotated"
  46tags; they contain a creation date, the tagger name and e-mail, a
  47tagging message, and an optional GnuPG signature. Whereas a
  48"lightweight" tag is simply a name for an object (usually a commit
  49object).
  50
  51Annotated tags are meant for release while lightweight tags are meant
  52for private or temporary object labels. For this reason, some git
  53commands for naming objects (like `git describe`) will ignore
  54lightweight tags by default.
  55
  56
  57OPTIONS
  58-------
  59-a::
  60--annotate::
  61        Make an unsigned, annotated tag object
  62
  63-s::
  64--sign::
  65        Make a GPG-signed tag, using the default e-mail address's key.
  66
  67-u <key-id>::
  68--local-user=<key-id>::
  69        Make a GPG-signed tag, using the given key.
  70
  71-f::
  72--force::
  73        Replace an existing tag with the given name (instead of failing)
  74
  75-d::
  76--delete::
  77        Delete existing tags with the given names.
  78
  79-v::
  80--verify::
  81        Verify the gpg signature of the given tag names.
  82
  83-n<num>::
  84        <num> specifies how many lines from the annotation, if any,
  85        are printed when using -l.
  86        The default is not to print any annotation lines.
  87        If no number is given to `-n`, only the first line is printed.
  88        If the tag is not annotated, the commit message is displayed instead.
  89
  90-l <pattern>::
  91--list <pattern>::
  92        List tags with names that match the given pattern (or all if no
  93        pattern is given).  Running "git tag" without arguments also
  94        lists all tags. The pattern is a shell wildcard (i.e., matched
  95        using fnmatch(3)).  Multiple patterns may be given; if any of
  96        them matches, the tag is shown.
  97
  98--column[=<options>]::
  99--no-column::
 100        Display tag listing in columns. See configuration variable
 101        column.tag for option syntax.`--column` and `--no-column`
 102        without options are equivalent to 'always' and 'never' respectively.
 103+
 104This option is only applicable when listing tags without annotation lines.
 105
 106--contains <commit>::
 107        Only list tags which contain the specified commit.
 108
 109--points-at <object>::
 110        Only list tags of the given object.
 111
 112-m <msg>::
 113--message=<msg>::
 114        Use the given tag message (instead of prompting).
 115        If multiple `-m` options are given, their values are
 116        concatenated as separate paragraphs.
 117        Implies `-a` if none of `-a`, `-s`, or `-u <key-id>`
 118        is given.
 119
 120-F <file>::
 121--file=<file>::
 122        Take the tag message from the given file.  Use '-' to
 123        read the message from the standard input.
 124        Implies `-a` if none of `-a`, `-s`, or `-u <key-id>`
 125        is given.
 126
 127--cleanup=<mode>::
 128        This option sets how the tag message is cleaned up.
 129        The  '<mode>' can be one of 'verbatim', 'whitespace' and 'strip'.  The
 130        'strip' mode is default. The 'verbatim' mode does not change message at
 131        all, 'whitespace' removes just leading/trailing whitespace lines and
 132        'strip' removes both whitespace and commentary.
 133
 134<tagname>::
 135        The name of the tag to create, delete, or describe.
 136        The new tag name must pass all checks defined by
 137        linkgit:git-check-ref-format[1].  Some of these checks
 138        may restrict the characters allowed in a tag name.
 139
 140<commit>::
 141<object>::
 142        The object that the new tag will refer to, usually a commit.
 143        Defaults to HEAD.
 144
 145
 146CONFIGURATION
 147-------------
 148By default, 'git tag' in sign-with-default mode (-s) will use your
 149committer identity (of the form "Your Name <\your@email.address>") to
 150find a key.  If you want to use a different default key, you can specify
 151it in the repository configuration as follows:
 152
 153-------------------------------------
 154[user]
 155    signingkey = <gpg-key-id>
 156-------------------------------------
 157
 158
 159DISCUSSION
 160----------
 161
 162On Re-tagging
 163~~~~~~~~~~~~~
 164
 165What should you do when you tag a wrong commit and you would
 166want to re-tag?
 167
 168If you never pushed anything out, just re-tag it. Use "-f" to
 169replace the old one. And you're done.
 170
 171But if you have pushed things out (or others could just read
 172your repository directly), then others will have already seen
 173the old tag. In that case you can do one of two things:
 174
 175. The sane thing.
 176Just admit you screwed up, and use a different name. Others have
 177already seen one tag-name, and if you keep the same name, you
 178may be in the situation that two people both have "version X",
 179but they actually have 'different' "X"'s.  So just call it "X.1"
 180and be done with it.
 181
 182. The insane thing.
 183You really want to call the new version "X" too, 'even though'
 184others have already seen the old one. So just use 'git tag -f'
 185again, as if you hadn't already published the old one.
 186
 187However, Git does *not* (and it should not) change tags behind
 188users back. So if somebody already got the old tag, doing a
 189'git pull' on your tree shouldn't just make them overwrite the old
 190one.
 191
 192If somebody got a release tag from you, you cannot just change
 193the tag for them by updating your own one. This is a big
 194security issue, in that people MUST be able to trust their
 195tag-names.  If you really want to do the insane thing, you need
 196to just fess up to it, and tell people that you messed up. You
 197can do that by making a very public announcement saying:
 198
 199------------
 200Ok, I messed up, and I pushed out an earlier version tagged as X. I
 201then fixed something, and retagged the *fixed* tree as X again.
 202
 203If you got the wrong tag, and want the new one, please delete
 204the old one and fetch the new one by doing:
 205
 206        git tag -d X
 207        git fetch origin tag X
 208
 209to get my updated tag.
 210
 211You can test which tag you have by doing
 212
 213        git rev-parse X
 214
 215which should return 0123456789abcdef.. if you have the new version.
 216
 217Sorry for the inconvenience.
 218------------
 219
 220Does this seem a bit complicated?  It *should* be. There is no
 221way that it would be correct to just "fix" it automatically.
 222People need to know that their tags might have been changed.
 223
 224
 225On Automatic following
 226~~~~~~~~~~~~~~~~~~~~~~
 227
 228If you are following somebody else's tree, you are most likely
 229using remote-tracking branches (`refs/heads/origin` in traditional
 230layout, or `refs/remotes/origin/master` in the separate-remote
 231layout).  You usually want the tags from the other end.
 232
 233On the other hand, if you are fetching because you would want a
 234one-shot merge from somebody else, you typically do not want to
 235get tags from there.  This happens more often for people near
 236the toplevel but not limited to them.  Mere mortals when pulling
 237from each other do not necessarily want to automatically get
 238private anchor point tags from the other person.
 239
 240Often, "please pull" messages on the mailing list just provide
 241two pieces of information: a repo URL and a branch name; this
 242is designed to be easily cut&pasted at the end of a 'git fetch'
 243command line:
 244
 245------------
 246Linus, please pull from
 247
 248        git://git..../proj.git master
 249
 250to get the following updates...
 251------------
 252
 253becomes:
 254
 255------------
 256$ git pull git://git..../proj.git master
 257------------
 258
 259In such a case, you do not want to automatically follow the other
 260person's tags.
 261
 262One important aspect of Git is its distributed nature, which
 263largely means there is no inherent "upstream" or
 264"downstream" in the system.  On the face of it, the above
 265example might seem to indicate that the tag namespace is owned
 266by the upper echelon of people and that tags only flow downwards, but
 267that is not the case.  It only shows that the usage pattern
 268determines who are interested in whose tags.
 269
 270A one-shot pull is a sign that a commit history is now crossing
 271the boundary between one circle of people (e.g. "people who are
 272primarily interested in the networking part of the kernel") who may
 273have their own set of tags (e.g. "this is the third release
 274candidate from the networking group to be proposed for general
 275consumption with 2.6.21 release") to another circle of people
 276(e.g. "people who integrate various subsystem improvements").
 277The latter are usually not interested in the detailed tags used
 278internally in the former group (that is what "internal" means).
 279That is why it is desirable not to follow tags automatically in
 280this case.
 281
 282It may well be that among networking people, they may want to
 283exchange the tags internal to their group, but in that workflow
 284they are most likely tracking each other's progress by
 285having remote-tracking branches.  Again, the heuristic to automatically
 286follow such tags is a good thing.
 287
 288
 289On Backdating Tags
 290~~~~~~~~~~~~~~~~~~
 291
 292If you have imported some changes from another VCS and would like
 293to add tags for major releases of your work, it is useful to be able
 294to specify the date to embed inside of the tag object; such data in
 295the tag object affects, for example, the ordering of tags in the
 296gitweb interface.
 297
 298To set the date used in future tag objects, set the environment
 299variable GIT_COMMITTER_DATE (see the later discussion of possible
 300values; the most common form is "YYYY-MM-DD HH:MM").
 301
 302For example:
 303
 304------------
 305$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1
 306------------
 307
 308include::date-formats.txt[]
 309
 310SEE ALSO
 311--------
 312linkgit:git-check-ref-format[1].
 313
 314GIT
 315---
 316Part of the linkgit:git[1] suite