将git branch转换为git标签

时间:2011-06-15 12:06:09

标签: git version-control git-tag

我正在寻找将git分支转换为git标记的最佳和最安全的方法。当手动移植到svn存储库时,我基本上复制了我们所有的分支,并且我们为每个次要版本(1.1,1.2,1.3)都有一个分支,这一点可能并不是最好的方法,但为了速度,我对分支比当时的标签更舒服。我现在有分支1.5,1.6,1.7,1.8但是因为我们在任何给定时间只有1个版本的代码部署,我可能只需要最后一个版本作为分支,因为任何热修复需要进入该版本部署。所以我正在寻找将git分支转换为git标签的最佳方法。我想我有办法,但确定它有多好。

到目前为止,我所做的每个分支都要转换为标记,我已经检查过以确保那些不在master分支中的分支中没有提交,所以我做了:

git log 1.5 ^master
git log 1.6 ^master
git log 1.7 ^master

所有这些都没有给我任何回报,我相信这意味着这些分支中的所有提交都存在于master中。我这样做是因为我假设如果那些分支中的提交不在master中,我会在将分支转换为标记时丢失它们,因为标记只是一个提交而不是开发线的“指针”。看起来很好,我的假设是我只需做:

git tag 1.5v 1.5
git tag 1.6v 1.6
git tag 1.7v 1.7

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

我还有一个问题是,如果有人从1.7开始创建了一个分支(没有人应该这样做)并且他们提取删除该分支的更改,他们是否能够将这些更改合并到另一个分支(比如master)或者那会打破他们创造的分支吗?这是一个不应该发生的情况,因为除了最后一个版本之外没有人应该创建任何分支版本的分支,在这种情况下为1.8,但是人们并不总是正确地遵循过程,所以我想确保有一种方法如果它发生,解决这个问题。

2 个答案:

答案 0 :(得分:6)

简短回答:这不是问题。虽然我建议您使用-m选项创建带注释的注释标记(请参阅man git-tag),然后按照您提议的方式创建标记,因为这会创建一个“第一类”标记,将由git describe等使用而无需其他参数。

答案很长: 远程分支不会直接影响本地分支。如果我从公共仓库的分支或标签创建分支,当您删除该分支,并且我获取您的仓库时,我会看到您的分支已经消失,但我的分支仍在我的仓库中完成。

Brances只是git repo中提交的符号名称,当您提交HEAD并且您正在处理的分支指向新提交时。标签也是提交的符号名称,但这不可更改(您可以删除它,但不能更改),因此它指向历史记录中的固定位置,而分支指向移动磁头历史上的一条线。由于git中的提交有零个,一个或多个父提交(初始提交为零,一个用于正常提交,一个用于合并),即使从远程删除原始分支或标记,您的本地仓库仍然具有指向您本地分支的指针,从中您可以找到一个共同的祖先(假设分支首先是相关的),因此您仍然可以将对任何分支所做的更改合并为master。

从svn到git起初可能会有点混乱。听起来你仍然在用svn术语思考,让一切更加混乱。我认为如果你认为git更像是一个高级文件系统(这是Linus Torvalds写的时候),而不是源代码控制工具,那会更容易。我还建议你花一些时间阅读(或浏览)git for computer scientists,它并不像听起来那么令人生畏;并且更好地了解它的实际工作方式将有助于您思考“正确的方法”。 ;)

答案 1 :(得分:3)

据我了解,您希望创建标签而不是分支,从而阻止其他人继续在这些分支上提交。

不幸的是,你不能阻止人们从任何地方创建分支,特别是因为Git是一个分散的VCS。但是,您可以决定是否可以将提交推送到中央存储库。因此,您可以编写钩子,禁止在其祖先中具有特定提交的提交。