7

我正在寻找将 git 分支转换为 git 标签的最佳和最安全的方法。当手动移植一个 svn 存储库时,我基本上复制了我们所有的分支,并且每个次要版本(1.1、1.2、1.3)都有一个分支,老实说,这可能不是最好的方法,但为了速度,当时我更喜欢使用分支而不是标签。我现在有分支 1.5、1.6、1.7、1.8 但是由于我们在任何给定时间只部署了一个版本的代码,我可能只需要最后一个版本作为分支,以防任何热修复需要进入那个版本已部署。所以我正在寻找将 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)之外,不应从任何分支版本创建分支,但人们并不总是正确地遵循程序,所以我想确保有一种方法如果发生这种情况来解决这个问题。

4

2 回答 2

6

简短的回答:这不是问题。并且按照您建议的方式创建标签是可以的,尽管我建议您使用该-m选项来创建带有注释的带注释的标签(请参阅 参考资料man git-tag),因为这将创建一个“第一类”标签,将由git describeetc. 使用而无需额外的参数。

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

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

从 svn 到 git 一开始可能会有点混乱。听起来你还在用 svn 术语思考,让一切变得更加混乱。我认为如果您将 git 更多地视为一个高级文件系统(这是 Linus Torvalds 编写它时的样子),而不是源代码控制工具,它会更容易。我还建议您花一些时间阅读(或浏览)计算机科学家的 git,它并不像听起来那么令人生畏;并更好地了解它的实际工作原理将帮助您思考“正确的方式”。;)

于 2011-06-15T12:53:00.857 回答
3

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

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

于 2011-06-15T12:15:56.160 回答