设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
修补
调试
邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.46.1 → 2.47.0 无更改
- 2.46.0 07/29/24
- 2.45.1 → 2.45.2 无更改
- 2.45.0 04/29/24
- 2.44.1 → 2.44.2 无更改
- 2.44.0 02/23/24
- 2.42.1 → 2.43.5 无更改
- 2.42.0 08/21/23
- 2.41.1 → 2.41.2 无更改
- 2.41.0 06/01/23
- 2.39.1 → 2.40.3 无更改
- 2.39.0 12/12/22
- 2.35.1 → 2.38.5 无更改
- 2.35.0 01/24/22
- 2.31.1 → 2.34.8 无更改
- 2.31.0 03/15/21
- 2.29.1 → 2.30.9 无更改
- 2.29.0 10/19/20
- 2.27.1 → 2.28.1 无更改
- 2.27.0 06/01/20
- 2.25.1 → 2.26.3 无更改
- 2.25.0 01/13/20
- 2.23.1 → 2.24.4 无更改
- 2.23.0 08/16/19
- 2.21.1 → 2.22.5 无更改
- 2.21.0 02/24/19
- 2.19.3 → 2.20.5 无更改
- 2.19.2 11/21/18
- 2.19.1 无更改
- 2.19.0 09/10/18
- 2.18.1 → 2.18.5 无更改
- 2.18.0 06/21/18
- 2.17.1 → 2.17.6 无更改
- 2.17.0 04/02/18
- 2.15.4 → 2.16.6 无更改
- 2.14.6 12/06/19
- 2.13.7 05/22/18
- 2.12.5 09/22/17
- 2.11.4 09/22/17
- 2.10.5 09/22/17
- 2.9.5 07/30/17
- 2.8.6 无更改
- 2.7.6 07/30/17
- 2.6.7 05/05/17
- 2.5.6 无更改
- 2.4.12 05/05/17
- 2.2.3 → 2.3.10 无更改
- 2.1.4 12/17/14
- 2.0.5 12/17/14
概要
git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] [-e] [(--trailer <token>[(=|:)<value>])…] <tagname> [<commit> | <object>] git tag -d <tagname>… git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>] [--points-at <object>] [--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>] [--format=<format>] [--merged <commit>] [--no-merged <commit>] [<pattern>…] git tag -v [--format=<format>] <tagname>…
描述
在 refs/tags/
中添加标签引用,除非给出 -d/-l/-v
来删除、列出或验证标签。
除非给出 -f
,否则指定的标签必须不存在。
如果传递了 -a
、-s
或 -u <key-id>
之一,则该命令会创建一个标签对象,并需要一个标签消息。除非给出 -m <msg>
或 -F <file>
,否则会启动一个编辑器供用户输入标签消息。
如果给出 -m <msg>
或 -F <file>
或 --trailer <token>[=<value>]
且 -a
、-s
和 -u <key-id>
缺失,则隐含 -a
。
否则,将创建一个直接指向给定对象(即轻量级标签)的标签引用。
当使用 -s
或 -u <key-id>
时,将创建 GnuPG 签名的标签对象。当不使用 -u <key-id>
时,当前用户的提交者身份用于查找用于签名的 GnuPG 密钥。配置变量 gpg.program
用于指定自定义 GnuPG 二进制文件。
标签对象(使用 -a
、-s
或 -u
创建)称为“带注释的”标签;它们包含创建日期、标签者姓名和电子邮件、标签消息以及可选的 GnuPG 签名。而“轻量级”标签只是对象的名称(通常是提交对象)。
带注释的标签用于发布,而轻量级标签用于私有或临时对象标签。因此,一些用于命名对象的 git 命令(如 git describe
)默认情况下会忽略轻量级标签。
选项
- -a
- --annotate
-
创建一个未签名的带注释的标签对象
- -s
- --sign
-
使用默认电子邮件地址的密钥创建 GPG 签名的标签。如果存在,则由
tag.gpgSign
配置变量控制标签 GPG 签名的默认行为,否则禁用。请参阅 git-config[1]。 - --no-sign
-
覆盖设置为强制对每个标签进行签名的
tag.gpgSign
配置变量。 - -u <key-id>
- --local-user=<key-id>
-
使用给定的密钥创建 GPG 签名的标签。
- -f
- --force
-
替换具有给定名称的现有标签(而不是失败)
- -d
- --delete
-
删除具有给定名称的现有标签。
- -v
- --verify
-
验证给定标签名称的 GPG 签名。
- -n<num>
-
<num> 指定使用 -l 时打印的批注行数(如果有)。暗示
--list
。默认情况下不打印任何批注行。如果未向
-n
提供数字,则仅打印第一行。如果标签未加批注,则会显示提交消息。 - -l
- --list
-
列出标签。使用可选的
<pattern>...
,例如git tag --list 'v-*'
,仅列出与模式匹配的标签。在不带参数的情况下运行“git tag”也会列出所有标签。模式是 shell 通配符(即,使用 fnmatch(3) 匹配)。可以给出多个模式;如果任何模式匹配,则显示标签。
如果提供了任何其他类似列表的选项(例如
--contains
),则会隐式提供此选项。有关详细信息,请参阅每个选项的文档。 - --sort=<key>
-
根据给定的键排序。在键前缀
-
以按值的降序排序。您可以多次使用 --sort=<key> 选项,在这种情况下,最后一个键成为主键。还支持“version:refname”或“v:refname”(标签名称被视为版本)。“version:refname”排序顺序也可能受“versionsort.suffix”配置变量的影响。支持的键与git for-each-ref
中的键相同。排序顺序默认为tag.sort
变量的配置值(如果存在),否则为字典顺序。请参阅 git-config[1]。 - --color[=<when>]
-
尊重在
--format
选项中指定的任何颜色。<when>
字段必须是always
、never
或auto
之一(如果<when>
缺失,则表现得好像给出了always
)。 - -i
- --ignore-case
-
标签的排序和过滤不区分大小写。
- --omit-empty
-
在格式化的 ref 之后不打印换行符,其中格式扩展为空字符串。
- --column[=<options>]
- --no-column
-
以列的形式显示标签列表。有关选项语法,请参阅配置变量
column.tag
。不带选项的--column
和--no-column
分别等效于 always 和 never。此选项仅适用于列出不带批注行的标签时。
- --contains [<commit>]
-
仅列出包含指定提交的标签(如果未指定,则为 HEAD)。暗示
--list
。 - --no-contains [<commit>]
-
仅列出不包含指定提交的标签(如果未指定,则为 HEAD)。暗示
--list
。 - --merged [<commit>]
-
仅列出其提交可从指定提交(如果未指定,则为
HEAD
)访问的标签。 - --no-merged [<commit>]
-
仅列出其提交无法从指定提交(如果未指定,则为
HEAD
)访问的标签。 - --points-at <object>
-
仅列出给定对象的标签(如果未指定,则为 HEAD)。暗示
--list
。 - -m <msg>
- --message=<msg>
-
使用给定的标签消息(而不是提示)。如果给出多个
-m
选项,则它们的值将作为单独的段落连接起来。如果未给出-a
、-s
或-u <key-id>
,则暗示-a
。 - -F <file>
- --file=<file>
-
从给定文件中获取标签消息。使用 - 从标准输入读取消息。如果未给出
-a
、-s
或-u <key-id>
,则暗示-a
。 - --trailer <token>[(=|:)<value>]
-
指定应作为尾部应用的(<token>,<value>)对。(例如,
git tag --trailer "Custom-Key: value"
会向标签消息添加“Custom-Key”尾部。)trailer.*
配置变量(git-interpret-trailers[1])可用于定义是否省略重复的尾部,尾部在尾部运行中的出现位置以及其他详细信息。可以使用--format="%(trailers)"
占位符在git tag --list
中提取尾部。 - -e
- --edit
-
使用
-F
从文件和使用-m
从命令行获取的消息通常用作未修改的标签消息。此选项允许您进一步编辑从这些来源获取的消息。 - --cleanup=<mode>
-
此选项设置标签消息的清理方式。<mode> 可以是 verbatim、whitespace 和 strip 之一。strip 模式为默认模式。verbatim 模式不会更改消息,whitespace 仅删除开头/结尾的空白行,而 strip 则删除空白和注释。
- --create-reflog
-
为标签创建 reflog。要全局启用标签的 reflog,请参阅 git-config[1] 中的
core.logAllRefUpdates
。否定形式--no-create-reflog
仅覆盖之前的--create-reflog
,但目前不会否定core.logAllRefUpdates
的设置。 - --format=<format>
-
一个字符串,它从显示的标签引用及其指向的对象中插入
%(fieldname)
。格式与 git-for-each-ref[1] 中的格式相同。如果未指定,则默认为%(refname:strip=2)
。 - <tagname>
-
要创建、删除或描述的标签名称。新的标签名称必须通过 git-check-ref-format[1] 定义的所有检查。其中一些检查可能会限制标签名称中允许的字符。
- <commit>
- <object>
-
新标签将引用的对象,通常是提交。默认为 HEAD。
配置
默认情况下,git tag 在带签名模式 (-s) 下将使用您的提交者身份(格式为 Your Name <[email protected]>
)查找密钥。如果您想使用其他默认密钥,可以在存储库配置中指定如下
[user] signingKey = <gpg-key-id>
仅当列出标签时,才会尊重 pager.tag
,即当使用或隐含 -l
时。默认情况下使用分页器。请参阅 git-config[1]。
讨论
关于重新标记
当您标记了错误的提交并想要重新标记时,您应该怎么做?
如果您从未推送任何内容,只需重新标记即可。使用“-f”替换旧标签。搞定。
但是,如果您已经推送了一些内容(或其他人可以直接读取您的存储库),那么其他人已经看到了旧标签。在这种情况下,您可以执行以下两种操作之一
-
明智的做法。承认您犯了错误,并使用不同的名称。其他人已经看到了一个标签名称,如果您保留相同的名称,您可能会遇到两个人都拥有“版本 X”,但实际上他们拥有不同的“X”的情况。因此,只需将其命名为“X.1”即可。
-
不理智的做法。您确实希望将新版本也称为“X”,即使其他人已经看到了旧版本。因此,只需再次使用git tag -f,就像您还没有发布旧版本一样。
但是,Git 不会(也不应该)在用户不知情的情况下更改标签。因此,如果有人已经获得了旧标签,在您的树上执行git pull不应该仅仅覆盖旧标签。
如果有人从您那里获得了发布标签,您不能仅仅通过更新您自己的标签来更改他们的标签。这是一个重大的安全问题,因为人们**必须**能够信任他们的标签名称。如果您真的想做不理智的事情,您需要承认错误,并告诉人们您搞砸了。您可以通过发布公开声明来说明这一点
Ok, I messed up, and I pushed out an earlier version tagged as X. I then fixed something, and retagged the *fixed* tree as X again. If you got the wrong tag, and want the new one, please delete the old one and fetch the new one by doing: git tag -d X git fetch origin tag X to get my updated tag. You can test which tag you have by doing git rev-parse X which should return 0123456789abcdef.. if you have the new version. Sorry for the inconvenience.
这看起来有点复杂吗?应该是这样的。自动“修复”它绝非正确之举。人们需要知道他们的标签可能已被更改。
关于自动跟踪
如果您正在跟踪其他人的树,则很可能正在使用远程跟踪分支(例如 refs/remotes/origin/master
)。您通常希望获得另一端上的标签。
另一方面,如果您正在获取是因为您希望从其他人那里进行一次性合并,则通常不希望从那里获取标签。这种情况在接近顶层的人员中更常见,但不仅限于他们。当普通人互相拉取时,并不一定希望自动获取其他人的私有锚点标签。
通常,邮件列表上的“请拉取”消息只提供两条信息:一个仓库 URL 和一个分支名称;这旨在轻松地剪切粘贴到git fetch命令行的末尾
Linus, please pull from git://git..../proj.git master to get the following updates...
变成
$ git pull git://git..../proj.git master
在这种情况下,您不希望自动跟踪其他人的标签。
Git 的一个重要方面是其分布式特性,这在很大程度上意味着系统中没有固有的“上游”或“下游”。从表面上看,上面的例子似乎表明标签命名空间由上层人员拥有,并且标签只能向下流动,但事实并非如此。它仅表明使用模式决定了谁对谁的标签感兴趣。
一次性拉取表示提交历史现在正在跨越一群人之间的界限(例如,“主要对内核网络部分感兴趣的人”)他们可能有自己的一组标签(例如,“这是网络组提议用于 2.6.21 版本的第三个候选版本”)到另一群人(例如,“整合各种子系统改进的人”)。后者通常对前者组内部使用的详细标签不感兴趣(这就是“内部”的含义)。因此,在这种情况下不希望自动跟踪标签。
网络人员之间很可能希望交换他们组内部的标签,但在这种工作流程中,他们很可能通过拥有远程跟踪分支来跟踪彼此的进度。同样,自动跟踪此类标签的启发式方法是一件好事。
日期格式
GIT_AUTHOR_DATE
和 GIT_COMMITTER_DATE
环境变量支持以下日期格式
- Git 内部格式
-
它是
<unix-timestamp> <time-zone-offset>
,其中<unix-timestamp>
是自 UNIX 纪元以来的秒数。<time-zone-offset>
是相对于 UTC 的正或负偏移量。例如 CET(比 UTC 早 1 小时)是+0100
。 - RFC 2822
-
RFC 2822 中描述的标准日期格式,例如
Thu, 07 Apr 2005 22:13:13 +0200
。 - ISO 8601
-
由 ISO 8601 标准指定的日期和时间,例如
2005-04-07T22:13:13
。解析器也接受T
字符代替空格。秒的小数部分将被忽略,例如2005-04-07T22:13:13.019
将被视为2005-04-07T22:13:13
。注意此外,日期部分以下列格式接受: YYYY.MM.DD
、MM/DD/YYYY
和DD.MM.YYYY
。
注释
组合多个 --contains
和 --no-contains
过滤器时,仅显示至少包含一个 --contains
提交且不包含任何 --no-contains
提交的引用。
组合多个 --merged
和 --no-merged
过滤器时,仅显示至少可以从一个 --merged
提交到达且不从任何 --no-merged
提交到达的引用。
GIT
git[1] 套件的一部分