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 <keyid>] [-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] [--create-reflog] [--sort=<key>] 17 [--format=<format>] [--[no-]merged [<commit>]] [<pattern>...] 18'git tag' -v [--format=<format>] <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 <keyid>` 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 <keyid>` 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<keyid>` is used. When `-u <keyid>` 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 <keyid>:: 68--local-user=<keyid>:: 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:: 91--list:: 92 List tags. With optional `<pattern>...`, e.g. `git tag --list 93 'v-*'`, list only the tags that match the pattern(s). 94+ 95Running "git tag" without arguments also lists all tags. The pattern 96is a shell wildcard (i.e., matched using fnmatch(3)). Multiple 97patterns may be given; if any of them matches, the tag is shown. 98 99--sort=<key>:: 100 Sort based on the key given. Prefix `-` to sort in 101 descending order of the value. You may use the --sort=<key> option 102 multiple times, in which case the last key becomes the primary 103 key. Also supports "version:refname" or "v:refname" (tag 104 names are treated as versions). The "version:refname" sort 105 order can also be affected by the "versionsort.suffix" 106 configuration variable. 107 The keys supported are the same as those in `git for-each-ref`. 108 Sort order defaults to the value configured for the `tag.sort` 109 variable if it exists, or lexicographic order otherwise. See 110 linkgit:git-config[1]. 111 112-i:: 113--ignore-case:: 114 Sorting and filtering tags are case insensitive. 115 116--column[=<options>]:: 117--no-column:: 118 Display tag listing in columns. See configuration variable 119 column.tag for option syntax.`--column` and `--no-column` 120 without options are equivalent to 'always' and 'never' respectively. 121+ 122This option is only applicable when listing tags without annotation lines. 123 124--contains [<commit>]:: 125 Only list tags which contain the specified commit (HEAD if not 126 specified). 127 128--merged [<commit>]:: 129 Only list tags whose commits are reachable from the specified 130 commit (`HEAD` if not specified), incompatible with `--no-merged`. 131 132--no-merged [<commit>]:: 133 Only list tags whose commits are not reachable from the specified 134 commit (`HEAD` if not specified), incompatible with `--merged`. 135 136--points-at <object>:: 137 Only list tags of the given object. 138 139-m <msg>:: 140--message=<msg>:: 141 Use the given tag message (instead of prompting). 142 If multiple `-m` options are given, their values are 143 concatenated as separate paragraphs. 144 Implies `-a` if none of `-a`, `-s`, or `-u <keyid>` 145 is given. 146 147-F <file>:: 148--file=<file>:: 149 Take the tag message from the given file. Use '-' to 150 read the message from the standard input. 151 Implies `-a` if none of `-a`, `-s`, or `-u <keyid>` 152 is given. 153 154--cleanup=<mode>:: 155 This option sets how the tag message is cleaned up. 156 The '<mode>' can be one of 'verbatim', 'whitespace' and 'strip'. The 157 'strip' mode is default. The 'verbatim' mode does not change message at 158 all, 'whitespace' removes just leading/trailing whitespace lines and 159 'strip' removes both whitespace and commentary. 160 161--create-reflog:: 162 Create a reflog for the tag. To globally enable reflogs for tags, see 163 `core.logAllRefUpdates` in linkgit:git-config[1]. 164 The negated form `--no-create-reflog` only overrides an earlier 165 `--create-reflog`, but currently does not negate the setting of 166 `core.logallrefupdates`. 167 168<tagname>:: 169 The name of the tag to create, delete, or describe. 170 The new tag name must pass all checks defined by 171 linkgit:git-check-ref-format[1]. Some of these checks 172 may restrict the characters allowed in a tag name. 173 174<commit>:: 175<object>:: 176 The object that the new tag will refer to, usually a commit. 177 Defaults to HEAD. 178 179<format>:: 180 A string that interpolates `%(fieldname)` from the object 181 pointed at by a ref being shown. The format is the same as 182 that of linkgit:git-for-each-ref[1]. When unspecified, 183 defaults to `%(refname:strip=2)`. 184 185CONFIGURATION 186------------- 187By default, 'git tag' in sign-with-default mode (-s) will use your 188committer identity (of the form `Your Name <your@email.address>`) to 189find a key. If you want to use a different default key, you can specify 190it in the repository configuration as follows: 191 192------------------------------------- 193[user] 194 signingKey = <gpg-keyid> 195------------------------------------- 196 197 198DISCUSSION 199---------- 200 201On Re-tagging 202~~~~~~~~~~~~~ 203 204What should you do when you tag a wrong commit and you would 205want to re-tag? 206 207If you never pushed anything out, just re-tag it. Use "-f" to 208replace the old one. And you're done. 209 210But if you have pushed things out (or others could just read 211your repository directly), then others will have already seen 212the old tag. In that case you can do one of two things: 213 214. The sane thing. 215Just admit you screwed up, and use a different name. Others have 216already seen one tag-name, and if you keep the same name, you 217may be in the situation that two people both have "version X", 218but they actually have 'different' "X"'s. So just call it "X.1" 219and be done with it. 220 221. The insane thing. 222You really want to call the new version "X" too, 'even though' 223others have already seen the old one. So just use 'git tag -f' 224again, as if you hadn't already published the old one. 225 226However, Git does *not* (and it should not) change tags behind 227users back. So if somebody already got the old tag, doing a 228'git pull' on your tree shouldn't just make them overwrite the old 229one. 230 231If somebody got a release tag from you, you cannot just change 232the tag for them by updating your own one. This is a big 233security issue, in that people MUST be able to trust their 234tag-names. If you really want to do the insane thing, you need 235to just fess up to it, and tell people that you messed up. You 236can do that by making a very public announcement saying: 237 238------------ 239Ok, I messed up, and I pushed out an earlier version tagged as X. I 240then fixed something, and retagged the *fixed* tree as X again. 241 242If you got the wrong tag, and want the new one, please delete 243the old one and fetch the new one by doing: 244 245 git tag -d X 246 git fetch origin tag X 247 248to get my updated tag. 249 250You can test which tag you have by doing 251 252 git rev-parse X 253 254which should return 0123456789abcdef.. if you have the new version. 255 256Sorry for the inconvenience. 257------------ 258 259Does this seem a bit complicated? It *should* be. There is no 260way that it would be correct to just "fix" it automatically. 261People need to know that their tags might have been changed. 262 263 264On Automatic following 265~~~~~~~~~~~~~~~~~~~~~~ 266 267If you are following somebody else's tree, you are most likely 268using remote-tracking branches (eg. `refs/remotes/origin/master`). 269You usually want the tags from the other end. 270 271On the other hand, if you are fetching because you would want a 272one-shot merge from somebody else, you typically do not want to 273get tags from there. This happens more often for people near 274the toplevel but not limited to them. Mere mortals when pulling 275from each other do not necessarily want to automatically get 276private anchor point tags from the other person. 277 278Often, "please pull" messages on the mailing list just provide 279two pieces of information: a repo URL and a branch name; this 280is designed to be easily cut&pasted at the end of a 'git fetch' 281command line: 282 283------------ 284Linus, please pull from 285 286 git://git..../proj.git master 287 288to get the following updates... 289------------ 290 291becomes: 292 293------------ 294$ git pull git://git..../proj.git master 295------------ 296 297In such a case, you do not want to automatically follow the other 298person's tags. 299 300One important aspect of Git is its distributed nature, which 301largely means there is no inherent "upstream" or 302"downstream" in the system. On the face of it, the above 303example might seem to indicate that the tag namespace is owned 304by the upper echelon of people and that tags only flow downwards, but 305that is not the case. It only shows that the usage pattern 306determines who are interested in whose tags. 307 308A one-shot pull is a sign that a commit history is now crossing 309the boundary between one circle of people (e.g. "people who are 310primarily interested in the networking part of the kernel") who may 311have their own set of tags (e.g. "this is the third release 312candidate from the networking group to be proposed for general 313consumption with 2.6.21 release") to another circle of people 314(e.g. "people who integrate various subsystem improvements"). 315The latter are usually not interested in the detailed tags used 316internally in the former group (that is what "internal" means). 317That is why it is desirable not to follow tags automatically in 318this case. 319 320It may well be that among networking people, they may want to 321exchange the tags internal to their group, but in that workflow 322they are most likely tracking each other's progress by 323having remote-tracking branches. Again, the heuristic to automatically 324follow such tags is a good thing. 325 326 327On Backdating Tags 328~~~~~~~~~~~~~~~~~~ 329 330If you have imported some changes from another VCS and would like 331to add tags for major releases of your work, it is useful to be able 332to specify the date to embed inside of the tag object; such data in 333the tag object affects, for example, the ordering of tags in the 334gitweb interface. 335 336To set the date used in future tag objects, set the environment 337variable GIT_COMMITTER_DATE (see the later discussion of possible 338values; the most common form is "YYYY-MM-DD HH:MM"). 339 340For example: 341 342------------ 343$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1 344------------ 345 346include::date-formats.txt[] 347 348SEE ALSO 349-------- 350linkgit:git-check-ref-format[1]. 351linkgit:git-config[1]. 352 353GIT 354--- 355Part of the linkgit:git[1] suite