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