3

我的任务是组织存储库,除了其他分支之外,还有一个专用分支,我们只存储已发布版本的提交。以下是我想要实现的简化方案:

| trunk    |           | releases |
|----------+-----------+----------|
| commit 1 |           |          |
| commit 2 | v0.1 ---> | tag 1    |
| commit 3 |           |          |
| commit 4 |           |          |
| commit 5 |           |          |
| commit 6 | v0.2 ---> | tag 2    |
| commit 7 |           |          |
| commit 8 |           |          |
| commit 9 |           |          |

这对我来说有点太先进了,所以我很感激一些关于如何做到这一点的指导!我不太确定如何在“发布”分支中拥有第二个标签,而无需导入所有中间提交。这有可能吗?

此外,如果您有更好的方案来实现相同的目标(目标是有一个专门的发布分支),请不要犹豫,建议!

4

4 回答 4

6

这是没有意义的,因为标记的提交代表了一个分支的状态,由提交及其前身组成。

仅隔离标记的提交会写出非常不同的历史,因为这些提交会错过它们的祖先:正是所述祖先的序列加上标记的提交将代码库引导到特定状态。

更简单的方法是确保将发布提交标记在一个专用分支(例如 master)中。

然后,一个简单的git show-ref --tags可以列出这些标签引用的comimts。

或者您可以从这些标签中的任何一个创建分支(用于修复版本的错误)

git checkout -b newbranch v1.0

您可以从任何提交( )中推断出最后一个发布标签。git describe --long


OP wvxvw在评论中添加:

但是带有发布的分支仅用于存储其中的特殊提交(标记的提交)的历史记录,并指向其他分支作为提交的来源

这可以通过将标签提交合并到“发布分支”中,并合并保留“他们的”(即合并的来源,即标记提交的来源)

--x--x--x--x--x--x--x
 (v1)     (v2)
   \        \ 
----y--------y--
于 2013-07-11T06:56:50.760 回答
3

这真的没有意义。在 git 中,分支名称只是一个指向特定提交的标签,其中名称在添加新提交时会自动“向前移动”:

C1 -- C2 -- C3         <-- label X
              \
                D1     <-- label Y

如果您在“分支 X”上添加提交(即标签 X 指向的位置),您会得到:

C1 -- C2 -- C3 -- C4   <-- label X
              \
                D1     <-- label Y

一个 git 标签要么是“轻量级的”,要么是“带注释的”。不同之处在于,第一个只是一个名称——只是一个标签,就像这里的 X 和 Y——指向一个特定的提交,而第二个是一个标签,指向存储在 repo 中的一种特殊对象,对象指向到提交(这允许带注释的标签比轻量级标签携带更多的数据:额外的数据与标签指向的提交 ID 一起存储)。但是,就我们这里的目的而言,这种区别并不真正相关。

假设我用标签 TC 和 TD 标记提交 C4 和 D1。我得到:

C1 -- C2 -- C3 -- C4   <-- branch X, tag TC
              \
                D1     <-- branch Y, TD

如果我向“分支 X”或“分支 Y”添加更多提交,则会发生分支标签移动,而标签标签保持固定的情况。例如,如果我添加提交 C5(在“分支 X”上),X 将指向 C5,但 TC 仍将指向 C4。但是,如果我通过将“branch Y”合并到“branch X”来做到这一点——这将是新的提交 C5——我会得到:

                   .------------- tag TC
                   v
C1 -- C2 -- C3 -- C4 -- C5   <-- branch X
               \      /
                  D1         <-- branch Y, tag TD

我现在可以(没有来自 git 的任何抱怨)完全删除“分支 Y”,因为它的提交被“包含在”(这实际上意味着,可以从)分支 X 和标记 TD 中。如果我这样做,“标记 TD”根本就不是“在分支 Y”上,因为分支 Y 不存在。即使我将分支 Y 留在原处,标签 TD 仍然包含在“分支 X”中!从 C5 开始,到第二个父母那里得到 D1,这是 TD 指向的地方。

于 2013-07-11T07:05:21.990 回答
1

你需要先了解一些关于 git 的东西:

  • 一个 git repo 可以看作是一堆提交。每个都有一个或两个(合并)父提交。
  • 标记只是指向其中一个提交的指针。它是固定的。
  • 分支也是指向其中一个提交的指针。但它总是指向您在该分支上所做的最后一次提交。所以它是一个“动态”指针。

也许这解释了为什么你想要的东西没有意义:标签独立于分支。

于 2013-07-11T06:59:35.380 回答
0

这是我以前使用的一个分支模型,用于将开发、错误修复、功能和发布都保持独立但协调一致。它可能会帮助你。

http://nvie.com/posts/a-successful-git-branching-model/

于 2013-07-12T18:28:08.740 回答