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