将 Git 分支转换为 Git 标签

8
我希望你能够将git分支转换为git标签的最佳且安全的方法。在手动移植svn存储库时,我基本上复制了所有的分支,并且我们每个小版本(1.1、1.2、1.3)都有一个分支,老实说这可能不是最好的做法,但出于速度考虑,当时我更喜欢使用分支而不是标签。现在,我有1.5、1.6、1.7、1.8等分支,但由于我们始终只有一个版本的代码部署在任何给定时间,我可能只需要将最后一个版本作为分支,以防需要对已部署的版本进行任何热修复。因此,我正在寻找将git分支转换为git标签的最佳方法。我认为我有一种方法,但不确定它有多好。
到目前为止,我所做的是针对我想要转换为标签的每个分支,我已经检查确保这些分支中没有提交不在主分支中的提交,所以我执行了:
git log 1.5 ^master
git log 1.6 ^master
git log 1.7 ^master

所有这些都没有返回任何结果,我相信这意味着这些分支中的所有提交都存在于主分支中。我这样做是因为我假设如果这些分支中有提交不在主分支中,那么当将分支转换为标签时,我会失去它们,因为标签只是指向一个提交而不是开发线。看起来很好,我的假设是我只需要执行以下操作:
git tag 1.5v 1.5
git tag 1.6v 1.6
git tag 1.7v 1.7

那么,我只需要在本地删除分支并将更改推送到远程存储库。这是将git分支转换为git标记的最佳方法吗?

还有一个问题是,如果有人从1.7创建了一个分支(不应该这样做),并且他们拉取删除该分支的更改,他们能否将这些更改合并到另一个分支(比如主分支)中,或者这会破坏他们创建的分支?这种情况不应该发生,因为没有人应该从版本1.8之外的任何版本创建分支,但人们并不总是正确地遵循程序,所以我想确保有一种方法可以解决这个问题。


在这里,我描述了一种有效的方法来将SVN标签分支转换为git标签:https://dev59.com/YE7Sa4cB1Zd3GeqP7_FN#20807602 - Onlyjob
2个回答

6
简短回答:这不是问题。按照您的建议创建标签是可以的,但我建议您使用-m选项创建带有注释的注释标签(请参阅man git-tag),因为这将创建一个“一流”的标签,无需其他参数即可被git describe等使用。
长回答:远程分支不会直接影响本地分支。如果我从您的公共存储库中创建了一个分支或标记,当您删除该分支并且我获取您的存储库时,我将看到您的分支已经消失,但我的分支仍然完整存在于我的存储库中。
分支只是git存储库中提交的符号名称,当您提交HEAD并且正在工作的分支指向新提交时。标记也是提交的符号名称,但这是不可改变的(尽管可以删除它,但不能更改它),因此它指向历史记录中的固定位置,而分支指向历史记录中一行移动的头部。由于git提交具有零个、一个或多个父提交(初始提交为零个,普通提交为一个,合并提交为多个),即使原始分支或标记从远程删除,您的本地存储库仍然具有指向您本地分支的指针,从中您可以找到一个共同的祖先(假设分支首先是相关的),因此您仍然可以将对任何分支所做的更改合并到主分支中。
从svn转到git可能会有点困惑。听起来您仍在考虑svn术语,使一切更加混乱。我认为如果您将git视为高级文件系统(这就是Linus Torvalds编写它时的情况),而不是源代码控制工具,那么这会更容易理解。我还建议您花些时间阅读(或浏览)计算机科学家的git,它并没有听起来那么令人生畏;并且更好地了解它实际上是如何工作的将有助于您正确思考。;)

3
据我理解,您想创建标签而不是分支,并防止其他人在这些分支上继续提交。

不幸的是,您无法阻止其他人从任何地方创建分支,特别是因为Git是一种分散式版本控制系统。但是,您可以决定是否可以将提交推送到中央存储库。因此,您可以编写钩子来禁止具有特定祖先提交的提交。


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