我的任务是组织存储库,除了其他分支之外还有一个专用分支,我们只存储已发布版本的提交。以下是我想要实现的简化方案:
| 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 | | |
现在这对我来说有点太先进了,所以我很欣赏一些关于如何做到这一点的指导!我不确定如何能够在“版本”分支中拥有第二个标记,而不必导入所有中间提交。这有可能吗?
此外,如果您有更好的方案来实现相同的目标(目标是仅为发布版本设置专用分支),请不要犹豫!
答案 0 :(得分:6)
这没有意义,因为标记的提交代表了一个由提交及其前身组成的分支的状态。
仅隔离标记的提交会写出一个非常不同的历史记录,因为这些提交会遗漏他们的祖先:它是所述祖先的序列加上标记的提交,它将代码库引导到特定的状态
更简单的方法是确保在一个专用分支(例如master)中标记发布提交。
然后,一个简单的git show-ref --tags
可以列出这些标签引用的comimts。
或者您可以create a branch from any of those tags(修复版本的错误)
git checkout -b newbranch v1.0
你可以deduce the last release tag from any commit(git describe --long
)。
但是发布的分支只存储特殊提交的历史记录(标记的),并指向其他分支作为提交来源的来源
通过将“发布分支”中的标记提交与a merge which keeps "theirs"合并(即合并的来源,即标记提交的来源),可以实现这一点。
--x--x--x--x--x--x--x
(v1) (v2)
\ \
----y--------y--
答案 1 :(得分: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,对象指向commit(这允许带注释的标签携带比轻量标签更多的数据:额外数据与标签指向的commit-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。但是,如果我通过将“分支Y”合并到“分支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指向的地方。
答案 2 :(得分:1)
你需要首先了解一些关于git的事情:
也许这就解释了,为什么你想要的并不真正有意义:标签独立于分支。
答案 3 :(得分:0)
这是我之前用过的分支模型,用于保持开发,错误修正,功能和发布都是独立的,但是协调一致。它可能对你有帮助。