我在master分支上创建了一个标记,v0.1
如下所示:
git tag -a v0.1
Run Code Online (Sandbox Code Playgroud)
但后来我意识到我需要将一些更改合并到master for release 0.1中,所以我做到了.但现在我的v0.1
标签被卡住了(以调用便利贴的类比)错误的提交.我希望它停留在master上的最新提交中,但它仍然停留在master上的第二次最新提交.
如何将其移动到master上的最新提交?
Gre*_*ill 1104
使用-f
选项git tag
:
-f
--force
Replace an existing tag with the given name (instead of failing)
Run Code Online (Sandbox Code Playgroud)
您可能希望-f
与-a
强制创建带注释的标记而不是未注释的标记一起使用.
在推送之前删除任何遥控器上的标签
git push origin :refs/tags/<tagname>
Run Code Online (Sandbox Code Playgroud)替换标记以引用最近的提交
git tag -fa <tagname>
Run Code Online (Sandbox Code Playgroud)将标签推到远程原点
git push origin master --tags
Run Code Online (Sandbox Code Playgroud)小智 247
更确切地说,您必须强制添加标记,然后使用选项--tags和-f进行推送:
git tag -f -a <tagname>
git push -f --tags
Run Code Online (Sandbox Code Playgroud)
Viv*_*ive 147
总结你的遥控器是否被调用origin
并且你正在master
分支机构:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
Run Code Online (Sandbox Code Playgroud)
您还可以交换第4行以git push origin --tags
使用本地更改中的标记推送所有更改.
基于@ stuart-golodetz,@ greg-hewgill,@ hedeep,@ ben-hocking答案,评论低于他们的答案,NateS评论低于我的答案.
Stu*_*etz 86
删除它,git tag -d <tagname>
然后在正确的提交上重新创建它.
Iva*_*van 35
我在使用Git时尽量避免一些事情.
使用内部知识,例如refs/tags.我尝试仅使用记录的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)
Run Code Online (Sandbox Code Playgroud)
github
是示例远程名称,fix123
示例标记名称和790a621265
示例提交.
Nak*_*lon 18
我将离开这里,这个命令的另一种形式符合我的需要.
有一个v0.0.1.2
我想要移动的标签.
$ git tag -f v0.0.1.2 63eff6a
Updated tag 'v0.0.1.2' (was 8078562)
Run Code Online (Sandbox Code Playgroud)
然后:
$ git push --tags --force
Run Code Online (Sandbox Code Playgroud)
Sev*_*ian 14
本地删除:
git tag -d v0.1
Run Code Online (Sandbox Code Playgroud)
在远程删除:
git push origin --delete v0.1
Run Code Online (Sandbox Code Playgroud)
然后在本地重新添加并push v0.1到最近的commit:
git tag -a v0.1
git push origin --tags
Run Code Online (Sandbox Code Playgroud)
将一个标记移动到另一个提交的别名.
在您的示例中,要使用散列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 #"
Run Code Online (Sandbox Code Playgroud)
另一种方式:
在远程仓库中移动标签(如果需要,请用其他标签替换HEAD)。
$ git push --force origin HEAD:refs/tags/v0.0.1.2
Run Code Online (Sandbox Code Playgroud)
取回更改。
$ git fetch --tags
Run Code Online (Sandbox Code Playgroud)
如果您使用 github 并希望更改提交以进行发布(例如您发现创建发布后没有提交)。您可以使用
git push origin :refs/tags/<tagname>
Run Code Online (Sandbox Code Playgroud)
执行此命令后,github 会删除您的标签,您的发布将成为草稿。这意味着您可以重新创建发布并选择提交。您的文件和消息将被保存。