如何提交到旧的Git标签?

16
两个月前,我将我们在SVN中的代码库与完整的更改历史迁移到了Git。之后,我们立即打了一个新的发布标记,并继续工作。所以,在我们继续使用新标记的同时,有些人还在SVN中修复旧标记中的bug。现在,我想将所有这些更改拉入Git中的那个标记。
我可以克隆标记,并让Git允许我在其中进行提交,但我无法使用git-push将任何内容推送回去。通过检查git-log,提交已经存在,但git-st告诉我,我当前没有处于任何分支上。
那么,互联网上,如何向旧的git标记提交代码?
7个回答

74

如果有人在搜索“替换git标签”或类似内容后来到这里,我推荐以下方法:

git tag -d <tagname>
git checkout <new commit or branch>
git tag -a <tagname>
git push <remotename> <tagname> -f

例如:

git checkout 2.0
git tag -d v2.0
git tag -a v2.0 -m"Version 2.0"
git push origin v2.0 -f

希望这能帮助到某个人。


1
最后一个命令也可以是:git push <remote_name> <tag_name> -f,例如:git push origin v2.0 -f。 - Fran Martinez

11

标签不可移动。一旦你创建了一个指向特定提交的标签,就无法更改该标签。

听起来你打算创建一个分支而不是标签。你应该创建一个新分支 (git branch 分支名 && git checkout 分支名),以确保不会丢失你的提交。然后将该分支推送到仓库,并让你的发布/修复开发人员在该分支上进行工作。


我正在寻找一种分支和覆盖旧标签的组合,因为这个标签是我们 SVN 存储库中的镜像代码。 - Jon Ursenbach
不幸的是,你不能真正覆盖旧标签。但你可以放弃它们。 :) - cdhowie
是的,这就是我最终要做的。把所有这些旧提交重新做回来真是太麻烦了。感谢您的帮助! - Jon Ursenbach
2
哦,我指的是放弃它们,就是忘记它们...你是在没有它们的情况下重新从SVN构建仓库吗? - cdhowie
标签是可移除的,您可以这样操作:git tag -d <tag>。但是在远程仓库中,您必须先删除标签然后才能进行另一个标签同步:git push origin --tags。 - linehrr
@linehrr,一旦标签被推送,这样做是不可取的;任何克隆该存储库的人在尝试获取时都会非常难过。 - cdhowie

11
您是指分支,而不是标签。在Git中,标签是您主分支上某一时刻的书签。尽管您可以覆盖标签(git tag -f),但这并不推荐。仅当标签尚未部署时,才会覆盖标签。

9
如果用户正在使用创建旧标签时所使用的相同分支,则首先创建新变更列表。否则,检出标签,然后创建新变更列表。然后使用以下步骤将新的变更列表号更新到现有标签中: git tag -f <旧标签名称> git push -f --tags 总共 0 个文件被更改(增加或删除)(delta 0),其中复用了 0 个文件(delta 0)。 + ... <旧标签名称> -> <旧标签名称> (强制更新)

1

如果我正确地理解了你的问题,你需要创建一个支线来存储你的提交。为此,请检出你想要推送的版本。在你的 Git Bash 中输入:

git branch old-version

这应该在您的提交位置创建一个名为old-version的分支。然后尝试推送。


1

你应该在标签的位置创建一个新分支,删除标签,进行提交,重新创建标签并推送。


1

这里有很多事情正在进行。

  1. 听起来你对 git tag 的目的没有足够的了解。我建议你阅读一下 man page,以及 Pro Gitrelevant sectionPro Git 也是一个很好的介绍工具的入门指南,还有 Git Magic

  2. 正如其他人指出的那样,你可能已经创建了一个分支,并在其上提交了代码,只是错误地将其标识为标签,或者你实际上创建了一个标签,并在分支之外提交了新的代码,这非常令人困惑。如果你还不知道如何使用它,你肯定需要阅读一下 git branch

  3. 听起来你和你的团队需要一个支持多个发布、维护和开发流的工作流程,我谦虚地建议你阅读 Vincent Driessen 的这篇 most excellent guide。我在我的上一家雇主向我的团队介绍了这个方法,它改变了我们的工作方式。阅读这篇文章应该会让你非常好地了解 git 如何最好地支持你的团队已经尝试过的工作方式。

  4. 没有直接提交到旧标签的方法。正如其他人指出的那样,标签只是特定提交的名称。然而,我有一些想法可能对你有帮助。

    1. 你可以通过 git checkout -b my-new-branch name-of-tag 基于标签检出一个分支。这将为你提供一个全新的基于该标签的分支,你可以在其中提交代码。共享该分支就像将其推送到公共触点并让其他人拉取它一样简单。

    2. 如果你想要一个移动的标签,你正在做一些“疯狂”的事情(至少在 git tag 的 man page 的作者看来是这样)。他们部分正确,因为移动标签实际上只是分支头,因此可以简单地成为一个分支。标签不应该成为这个故事的一部分。但是,如果你真的想要一个移动的标签,你可以通过跳过几个火圈,并按照 git tag man page 中的 Re-Tagging Section 中的说明进行跳跃,从而实现这一目标。


这是一个可用的Git标签页面链接:http://schacon.github.com/git/git-tag.html - ThomasW

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