将git分支转换为git标记

将git分支转换为git标记,git,version-control,git-tag,Git,Version Control,Git Tag,我正在寻找将git分支转换为git标记的最佳和最安全的方法。在手工移植svn存储库时,我基本上复制了我们所有的分支,每个小版本(1.1、1.2、1.3)都有一个分支,老实说,这可能不是最好的方法,但为了速度,我当时使用分支比使用标签更为方便。我现在有分支1.5、1.6、1.7、1.8,但由于我们在任何给定时间都只部署了一个版本的代码,我可能只需要最后一个版本作为分支,以防任何热修复程序需要进入部署的版本。因此,我正在寻找将git分支转换为git标记的最佳方法。我想我有办法,但我确信这有多好 到目

我正在寻找将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
所有这些都没有给我任何回报,我相信这意味着这些分支中的所有承诺都存在于大师之中。我这样做是因为我假设如果在那些不在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)之外,不应该在任何分支版本上创建分支,但人们并不总是正确地遵循此过程,因此我想确保有一种方法可以解决此问题

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


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

简短回答:这不是问题。虽然我建议您使用
-m
选项创建带注释的标记(请参见
mangit-tag
),但按照您建议的方式创建标记是可以的,因为这将创建一个“第一类”标记,该标记将由
git-descripe
等使用,无需附加参数

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

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

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