Answers:
使用该-f
选项可以git tag
:
-f
--force
Replace an existing tag with the given name (instead of failing)
您可能想与-f
一起使用,-a
以强制创建带注释的标签,而不是非带注释的标签。
按下前删除任何遥控器上的标签
git push origin :refs/tags/<tagname>
替换标签以引用最新的提交
git tag -fa <tagname>
将标签推到远端
git push origin master --tags
:refs/tag/<tagname>
应该是:refs/tags/<tagname>
。
git push -f origin <tagname>
总结一下是否调用了远程origin
并且您正在master
分支上:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
您还可以交换第4行,git push origin --tags
以使用本地更改中的标记推送所有更改。
基于@ stuart-golodetz,@ greg-hewgill,@ eedeep,@ ben-hocking答案,其答案下方的评论以及我的答案下方的NateS评论。
使用删除它,git tag -d <tagname>
然后在正确的提交上重新创建它。
使用Git时,我尽量避免一些事情。
使用内部知识,例如参考/标签。我尝试仅使用记录在案的Git命令,并避免使用需要了解.git目录内部内容的内容。(也就是说,我将Git视为Git用户,而不是Git开发人员。)
不需要时使用武力。
过分的事情。(按一下分支和/或很多标签,在我想要的位置获得一个标签。)
因此,这是我在不了解Git内部知识的情况下在本地和远程更改标签的非暴力解决方案。
当软件修复最终有问题并且需要更新/重新发布时,我会使用它。
git tag -d fix123 # delete the old local tag
git push github :fix123 # delete the old remote tag (use for each affected remote)
git tag fix123 790a621265 # create a new local tag
git push github fix123 # push new tag to remote (use for each affected remote)
github
是一个示例远程名称,fix123
是一个示例标记名称,以及790a621265
一个示例提交。
另一种方式:
在远程仓库中移动标签(如果需要,请用其他标签替换HEAD)。
$ git push --force origin HEAD:refs/tags/v0.0.1.2
取回更改。
$ git fetch --tags
将一个标签移动到另一提交的别名。
在您的样品,以招犯了哈希e2ea1639做:git tagm v0.1 e2ea1639
。
对于推送的标签,请使用git tagmp v0.1 e2ea1639
。
这两个别名都会使您保留原始日期和消息。如果您使用,git tag -d
则会丢失原始消息。
将它们保存在您的.gitconfig
文件中
# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"
# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0} }; END { print message }' | sed '$ d' | cat -s #"
### Move tag. Use: git tagm <tagname> <newcommit>
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"
### Move pushed tag. Use: git tagmp <tagname> <newcommit>
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"
如果要移动带注释的标签,请仅更改目标提交,但保留注释消息和其他元数据,方法是:
moveTag() {
local tagName=$1
# Support passing branch/tag names (not just full commit hashes)
local newTarget=$(git rev-parse $2^{commit})
git cat-file -p refs/tags/$tagName |
sed "1 s/^object .*$/object $newTarget/g" |
git hash-object -w --stdin -t tag |
xargs -I {} git update-ref refs/tags/$tagName {}
}
用法:moveTag <移动标签> <目标>
通过引用teerapap / git-move-annotated-tag.sh开发了上述功能。
git tag -f -a my_tag
已经保留了先前消息的消息(使用git version 2.11.0)。
git push origin :refs/tag/<tagname>
先执行git tag -fa <tagname>
然后再执行git push origin master --tags
。否则,您可能会在遥控器的引用列表中添加奇怪的东西,并附加^和{}字符。感谢codebasehq.com上的Dan指出了这一点。