git中丢失的标签

时间:2013-03-11 12:11:55

标签: git maven maven-release-plugin git-tag

使用maven release-plugin时,我遇到了git标签的问题。我们在mvn release:perform期间关闭了自动推送到git,并且完成以下操作来构建新版本:

  1. 从远程git repo中提取最新更改。
  2. mvn release:prepare
  3. mvn release:perform
  4. git push origin master
  5. git push --tags
  6. 此方案有效,提交已标记且一切正常。但是,在这种情况下,标签会丢失:

    1. 从远程git repo中提取最新更改。
    2. mvn release:prepare
    3. 有人向主人推送提交!
    4. mvn release:perform
    5. git push origin master - 不起作用,因为新提交在,所以
    6. git pull --rebase origin master
    7. git push origin master
    8. git push --tags
    9. Git表示已经推送了新标签,但是除了我之外的任何人(制作版本)都没有这些标签可用,使用gitk时它们也不可见,因此在所有实际应用中,标签都是丢失。

      这是git中的一个错误,还是一个使用错误(我们是否负责确保构建时没有提交)?

3 个答案:

答案 0 :(得分:3)

正如其他人已经说过的那样,问题是标签不会自动更新以指向rebase之后的新提交ID。

避免这种情况的一种简单方法是使用 merge 而不是 rebase 。然后你的提交将不会被修改,标签仍然指向正确的提交。

对于您的间接问题:其他人没有“看到”旧标签的原因是因为Git默认情况下仅在从提取的提交(例如,在提取的分支上)可以获取标签时才提取标签。要获取所有标记,请使用以下内容:

git fetch --tags

这将获得标签,但它们仍将指向旧的(在rebase之前)提交。

答案 1 :(得分:1)

这是一个使用错误。标记是指由SHA1哈希标识的特定提交。当您键入

git pull --rebase origin master

您正在重写历史记录,以便您的本地更改建立在远程master分支的新状态上。您标记的提交不再出现在此历史记录中,但使用gitk --all您应该能够看到它们仍存在于本地存储库中的备用历史记录中。

使用master分支直接用于标记版本以及为多个开发人员的推送提交打开可能是错误的。您可以为每个版本创建一个新分支,如this workflow

答案 2 :(得分:0)

正如在另一个答案中所说的那样,这一变化正在搞乱历史,因此标签不再是应有的位置。

现在,我可以通过以下方式获取我的标签:

删除本地git标记: git tag -d nameoftag

删除远程git标记(我已经推送过):git push origin :refs/tags/nameoftag

创建一个新标记,现在位于正确的位置:git tag nameoftag HEAD(HEAD可以代替sha-id)

最后,推送标签:git push --tags

现在其他人可以享受缺失的标签,但是对于未来,我想我只会发送一封我正在建设的电子邮件,警告任何推销东西的可怕后果。