使用maven release-plugin时,我遇到了git标签的问题。我们在mvn release:perform
期间关闭了自动推送到git,并且完成以下操作来构建新版本:
mvn release:prepare
mvn release:perform
git push origin master
git push --tags
此方案有效,提交已标记且一切正常。但是,在这种情况下,标签会丢失:
mvn release:prepare
mvn release:perform
git push origin master
- 不起作用,因为新提交在,所以git pull --rebase origin master
git push origin master
git push --tags
Git表示已经推送了新标签,但是除了我之外的任何人(制作版本)都没有这些标签可用,使用gitk
时它们也不可见,因此在所有实际应用中,标签都是丢失。
这是git中的一个错误,还是一个使用错误(我们是否负责确保构建时没有提交)?
答案 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
现在其他人可以享受缺失的标签,但是对于未来,我想我只会发送一封我正在建设的电子邮件,警告任何推销东西的可怕后果。