【发布时间】:2012-04-06 07:01:03
【问题描述】:
我已经使用 git 大约一年了,并且想使用标记来标记不同版本的提交。我找到了很多关于用于处理标签的命令的信息,但我想知道的是,如果我可以创建一个名为 1.1.0 的新分支而不必让我的头脑混乱,为什么还要使用标签有一套全新的 git 命令?
标记而不是分支必须有很多充分的理由,但我想知道这些优势是什么。
【问题讨论】:
我已经使用 git 大约一年了,并且想使用标记来标记不同版本的提交。我找到了很多关于用于处理标签的命令的信息,但我想知道的是,如果我可以创建一个名为 1.1.0 的新分支而不必让我的头脑混乱,为什么还要使用标签有一套全新的 git 命令?
标记而不是分支必须有很多充分的理由,但我想知道这些优势是什么。
【问题讨论】:
分支和标签是一回事(指向提交的指针,又名"ref"),除了分支自动移动到下一个提交,而标签在同一个提交上永远保持1。 p>
在发布版本时,您通常希望标记构建该版本的代码的“快照”,并且即使您继续改进代码,您也希望它保持这种标记,因此您会使用一个标签。
如果您尝试为此使用一个分支,它可能会无意中移动到另一个提交,而该版本是不是构建的。
1 当然,除非你删除标签。
注意:我意识到这是一个老问题,但我觉得分支和标签之间的相似性(和一个关键区别)并没有在其他答案中得到尽可能清楚的充实。 em>
【讨论】:
git commit 更新签出分支的头部以引用新提交,是的,但没有其他分支“自动”移动到下一个提交。您应该澄清答案的第一段。
.git\refs\heads 下的一行文件,包含提交的哈希。提交自己不会“记住”哪个分支创建了它们。这与 Mercurial 不同,例如,分支信息可以写入提交的元数据。
除了其他答案,这是我的 2 美分。
简答:为发布版本使用标签
长答案:我相信专门使用标签进行发布版本控制比使用分支更好。如果您需要更新版本,只需从标记的提交分支,一旦您完成该分支(很可能是修补程序分支)的工作,请在该新分支的头部创建一个带有新版本的新标签。然后,将该分支合并回 master/develop,因为您真的不应该更改发布版本,除非它是可能应该合并回源代码的修补程序。然后删除该分支,因为它不再需要。如果您需要对该新版本应用另一个修补程序,请重复相同的步骤。
请参阅以下文章中显示如何将修补程序与作者的 Git 工作流程合并的部分 - https://hackernoon.com/a-branching-and-releasing-strategy-that-fits-github-flow-be1b6c48eca2
【讨论】:
虽然您可以创建一个名为“1.0.0”的分支 - 您或任何拥有提交权限的人也可以简单地推送到该分支(有意或无意)并更改 1.0.0 的含义。
一旦你创建了一个标签,你就不能用标签做到这一点——就是这样;标签 1.0.0 就是这个意思,不能更改*。
这是标签和分支之间的主要实际区别
*您可以删除并重新创建标签,从而更改标签,但绝非偶然。
【讨论】:
标签主要用于将来参考项目的特定版本,通过标记提交。当然,你总是可以使用分支,但是如果你经常更改版本,你最终会得到很多未使用或很少使用的分支。
实际上,无论如何,标签都是没有分支的分支,只是添加了一种引用项目特定版本的方法以降低复杂性。
编辑:Here 是使用 git 的好方法,我用于所有项目。
【讨论】:
git-flow。使用develop 分支的最低要求不再是常见的做法,这也是有充分理由的,因为它在具有适当管道的快速发布周期设置中没有什么优点。
我倾向于使用同时包含标签 和 分支的工作流程。标签非常适合标记已发布的代码或显着的开发版本。分支有助于跟踪与特定版本相关的所有更改。
这里有一篇关于这种工作流的好文章:http://nvie.com/posts/a-successful-git-branching-model/
【讨论】:
您使用标签来记录历史上的重要提交。 “这是我们在构建服务器崩溃的那个下雨的星期四为此版本使用的确切提交”。如果您使用分支而不是标签,您将永远无法知道您使用的确切提交。你只知道“我们在这个分支的某个地方发布了 1.1.0 版本”,除非你手动写下那个提交的确切哈希,这就是你首先使用标签的原因:)
【讨论】: