我知道为什么git push——tags是一个单独的操作,而不是普通的git push。推标签应该是一个有意识的选择,因为你不想不小心推到一个标签。这很好。但是有没有办法把两者结合起来呢?(除了git push && git push——标签。)


当前回答

2020年8月更新

正如SoBeRich最初的回答中提到的,在我自己的回答中,git 2.4.x

git push --atomic origin <branch name> <tag>

(注意:这实际上只适用于HTTPS与Git 2.24)

2015年5月更新

从git 2.4.1开始,您可以这样做

git config --global push.followTags true

如果设置为true,默认启用——follow-tags选项。 您可以在推送时通过指定——no-follow-tags来覆盖此配置。

正如Matt Rogers在回答Wes Hurd时提到的:

——follow-tags只推送带注释的标签。

git tag -a -m "I'm an annotation" <tagname>

这将被推(与git tag <tagname>相反,这是一个轻量级标签,不会被推,正如我在这里提到的那样)

2013年4月更新

从git 1.8.3(2013年4月22日)开始,你不再需要执行2个命令来推送分支,然后再推送标签:

新的"——follow-tags"选项告诉"git push"在推出分支时推出相关的带注释的标签。

你现在可以尝试,当推送新的提交:

git push --follow-tags

不过,这不会推送所有的本地标记,只会推送git推送的提交所引用的标记。

Git 2.4.1+(2015年第二季度)将引入选项推送。followTags:参见“如何让“git push”在分支中包含标签?”。

最初的答案,2010年9月

核选项将是git push -mirror,它将推送refs/下的所有refs。

你也可以在当前分支提交时只推送一个标签:

git push origin : v1.0.0 

你可以将——tags选项与refspec组合在一起,比如:

git push origin --tags :

(因为——tags的意思是:除了命令行中明确列出的refspecs之外,refs/tags下的所有refs都会被推)


还有这个条目“使用单个“git push”调用推送分支和标签”

一个方便的提示刚刚发布到Git邮件列表Zoltán Füzesi: 我使用.git/config来解决这个问题:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

添加这些行后,git push origin将上传所有分支和标签。如果您只想上传其中的一些,可以枚举它们。 我自己还没有尝试过,但它看起来可能很有用,直到一些其他同时推送分支和标签的方式被添加到git push中。 另一方面,我不介意输入: $ git push && git push——标签

当心,正如Aseem Kishore所评论的那样

Push = +refs/heads/*将强制推送所有分支。

它刚才咬了我一下,供你参考。


René Scheibe补充了这个有趣的评论:

——follow-tags参数具有误导性,因为只考虑.git/refs/tags下的标签。 如果git gc运行,标记将从.git/refs/tags移动到.git/ packaged -refs。之后git push -follow-tags…不再像预期的那样工作。

其他回答

假设你在github上创建了一个新的repo。所以第一步是克隆repo:git克隆{你的repo URL}

你做你的工作,添加一些文件,代码等,然后推动你的变化:

git add .
git commit -m "first commit"
git push

现在我们的变更在主分支中。让我们创建一个标签:

git tag v1.0.0                    # creates tag locally     
git push origin v1.0.0            # pushes tag to remote

如果你想删除标签:

git tag --delete v1.0.0           # deletes tag locally    
git push --delete origin v1.0.0   # deletes remote tag

2020年8月更新

正如SoBeRich最初的回答中提到的,在我自己的回答中,git 2.4.x

git push --atomic origin <branch name> <tag>

(注意:这实际上只适用于HTTPS与Git 2.24)

2015年5月更新

从git 2.4.1开始,您可以这样做

git config --global push.followTags true

如果设置为true,默认启用——follow-tags选项。 您可以在推送时通过指定——no-follow-tags来覆盖此配置。

正如Matt Rogers在回答Wes Hurd时提到的:

——follow-tags只推送带注释的标签。

git tag -a -m "I'm an annotation" <tagname>

这将被推(与git tag <tagname>相反,这是一个轻量级标签,不会被推,正如我在这里提到的那样)

2013年4月更新

从git 1.8.3(2013年4月22日)开始,你不再需要执行2个命令来推送分支,然后再推送标签:

新的"——follow-tags"选项告诉"git push"在推出分支时推出相关的带注释的标签。

你现在可以尝试,当推送新的提交:

git push --follow-tags

不过,这不会推送所有的本地标记,只会推送git推送的提交所引用的标记。

Git 2.4.1+(2015年第二季度)将引入选项推送。followTags:参见“如何让“git push”在分支中包含标签?”。

最初的答案,2010年9月

核选项将是git push -mirror,它将推送refs/下的所有refs。

你也可以在当前分支提交时只推送一个标签:

git push origin : v1.0.0 

你可以将——tags选项与refspec组合在一起,比如:

git push origin --tags :

(因为——tags的意思是:除了命令行中明确列出的refspecs之外,refs/tags下的所有refs都会被推)


还有这个条目“使用单个“git push”调用推送分支和标签”

一个方便的提示刚刚发布到Git邮件列表Zoltán Füzesi: 我使用.git/config来解决这个问题:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

添加这些行后,git push origin将上传所有分支和标签。如果您只想上传其中的一些,可以枚举它们。 我自己还没有尝试过,但它看起来可能很有用,直到一些其他同时推送分支和标签的方式被添加到git push中。 另一方面,我不介意输入: $ git push && git push——标签

当心,正如Aseem Kishore所评论的那样

Push = +refs/heads/*将强制推送所有分支。

它刚才咬了我一下,供你参考。


René Scheibe补充了这个有趣的评论:

——follow-tags参数具有误导性,因为只考虑.git/refs/tags下的标签。 如果git gc运行,标记将从.git/refs/tags移动到.git/ packaged -refs。之后git push -follow-tags…不再像预期的那样工作。

Git GUI有一个PUSH按钮——原谅我的双关语,它打开的对话框有一个标签复选框。

我在没有标记的情况下从命令行推送了一个分支,然后使用上面描述的——follow-tags选项再次尝试推送该分支。该选项描述如下带注释的标记。我的标签很简单。

我修复了一些东西,在提交中标记了修复(这样同事们就可以选择修复),然后更改了软件版本号,并标记了我创建的版本(这样同事们就可以克隆那个版本)。

Git返回说一切都是最新的。它没有发送标签!也许是因为标签没有注释。也许是因为树枝上没有什么新东西。

当我用Git GUI做类似的推送时,标签被发送了。

目前,我将使用Git GUI而不是命令行和——follow-tag将更改推送到远程。

@since Git 2.4

Git推送——原子起源<分支名称> <标签>

试着everythig。

对我来说,避免在Gitlab上为同一个提交触发两个CI构建的唯一解决方案是:

git push -o ci.skip && git push --tags

@user1160006在评论中建议。

我在这里重复一遍,作为一个适当的答案,让感兴趣的人更容易看到它。 作为对我的提醒;)