如何使用Git将标签推送到远程仓库?

3353

我在我的机器上的主分支中添加了一个标签:

git tag mytag master

我该如何将这个推送到远程仓库?运行 git push 后显示:

Everything up-to-date

但是,远程仓库并不包含我的标签。

13个回答

5498

要推送一个单独的标签:

git push origin <tag_name>

以下命令应该会推送所有标签(不建议使用):

# not recommended
git push --tags

644
我建议不要使用或者训练别人使用 git push --tags,因为一旦你的同事习惯了推送所有标签,当你需要摆脱错误标签时就会变得非常困难。每次他们想要推送新标签的时候,都会将本地保存的旧的错误标签推送上去。因此,现在我只会建议别人使用 git push origin <tag_name> - Scott Jungwirth
70
推送一个已移动的标签:git push origin <tag_name> --force - Bob Stein
30
如果您的标签与远程分支相同,并且 git push 失败并显示 error: src refspec <tag_name> matches more than one.,您可以使用 git push origin tag <tag_name> 进行推送。 - Volodymyr Sapsai
8
请注意,git push --tags origin <tag_name> 并不是 你想要的操作 - 即使它命名了一个特定的标签,它仍会将所有标签一起推送,包括轻量级标签。叹气。 - nealmcb
18
如果您想推送所有标签,您可以首先运行命令 git push --dry-run --tags origin 来查看将要被推送的内容。请注意,此命令不会实际执行推送操作,只是显示将要被推送的标签信息。 - axxis
git push origin <tag_name> 对我不起作用。git push origin refs/tags/<tag_name> 可以工作。 - user2027712

1531
这是Git 1.8.3引入的一个明智的选项:
git push --follow-tags

它会推送所有提交和满足以下条件的标签:
- 标签是有注释的 - 标签可以从被推送的提交中追溯到(是其祖先)
这样做是合理的原因如下:
- 你应该只将有注释的标签推送到远程仓库,而保留轻量级标签用于本地开发,以避免标签冲突。参见:什么是有注释和无注释标签的区别? - 它不会推送与当前分支无关的有注释标签
正因为这些原因,应该避免使用--tags选项。
Git 2.4 已经添加了push.followTags选项,默认情况下启用该选项,你可以通过以下方式进行设置:
git config --global push.followTags true

或者通过将followTags = true添加到您的~/.gitconfig文件的[push]部分来实现。

Visual Studio Code

要在Visual Studio Code中激活此功能,请在用户或工作区基础上设置变量"git.followTagsWhenSync": trueGitHub


1
一开始对于“已注释的”和“从推送提交中可达”的关系并不清楚。我希望它会推送所有可达标签,无论是否已注释。也许可以编辑以确保它不是“或”的关系? - Gauthier
37
在 Git 2.5.0 版本中,这对我不起作用,但是 git push origin --tags 可以。 - nnyby
@nnyby,请提供一个最小化的示例,包括从创建仓库到失败所需的所有命令,并将其发布在gist上,以便我可以尝试复制;-) - Ciro Santilli OurBigBook.com
4
谢谢提供 followTags 的提示。我无法相信这不是默认设置。如果没有它,标签就毫无意义,你会忘记并且标签与同步失去联系。 - moodboom
增加了一行关于通过配置文件设置跟随标签的内容。 - einpoklum

336

如果要推送特定的标签,执行以下操作:

git push origin tag_name

126
为了进一步阐述Trevor的答案,你可以推送单个标签或同时推送所有标签。

推送单个标签

git push <remote> <tag>

这是相关文档的简介relevant documentation,用于解释此内容(部分命令选项已省略):
git push [[<repository> [<refspec>…]]

<refspec>...

The format of a <refspec> parameter is…the source ref <src>, followed by a colon :, followed by the destination ref <dst>

The <dst> tells which ref on the remote side is updated with this push…If :<dst> is omitted, the same ref as <src> will be updated…

tag <tag> means the same as refs/tags/<tag>:refs/tags/<tag>.

一次性推送所有标签

git push --tags <remote>
# Or
git push <remote> --tags

这里是相关文档的摘要(为了简洁起见,省略了一些命令选项):
git push [--all | --mirror | --tags] [<repository> [<refspec>…]]

--tags

All refs under refs/tags are pushed, in addition to refspecs explicitly listed on the command line.


这个例子漏掉了关键字 tag。例如:git push origin tag funny-tag-1 - JamesThomasMoon
1
@JamesThomasMoon1979 不需要。你只需像这样将单个标签推送到远程仓库:git push origin my-tag(我刚试过了!) - Andres F.
我正在使用版本 1.9.1,你呢 @AndresF.? - JamesThomasMoon
1
@JamesThomasMoon1979 版本 2.10.2。也许就是这样了? - Andres F.

104

在当前分支中添加一个标签。如果您想为主分支创建标签,请先切换到主分支。

git tag tag_name

检查是否已创建

git tag

将你的远程仓库推送

git push origin tag_name

89
你可以通过简单的 git push --tags 命令推送所有本地标签。
$ git tag                         # see tag lists
$ git push origin <tag-name>      # push a single tag
$ git push --tags                 # push all local tags 

68

55
您可以这样推送标签:git push --tags

6
非常不推荐。 - Tomer Gal

27

如何将我的标签推送到远程仓库,以便所有客户端计算机都可以看到它?

运行以下命令将mytag推送到您的 Git 远程源(例如:GitHub 或 GitLab)

git push origin refs/tags/mytag

最好像上面展示的一样使用完整的“refspec”(字面上为refs/tags/mytag),以防mytag实际上是模糊的(例如:因为还有一个名为v1.0.0的分支)。


22

我使用git push <remote-name> tag <tag-name>来确保我正在推送一个标签。 我的使用方式是:git push origin tag v1.0.1。 这种模式基于文档(man git-push)。

OPTIONS
   ...
   <refspec>...
       ...
       tag <tag> means the same as refs/tags/<tag>:refs/tags/<tag>.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接