假设我的gerrit中的当前日志看起来像下面这样:
- commit10(master)
- 提交9
- 提交8
- 提交7
- 提交6 v1.72.0
- 提交5
- commit4 v1.71.0
- 提交3
- 提交2
- 提交1
我的目标是创建一个新的标签(v1.73.0),其中应该包含commit 8和commit 9,并将其推送到origin。我被告知要基于最新的稳定标签创建一个新的本地分支,并挑选必要的提交并标记它。然而,我在将标签推送到master时遇到了一些问题。
我是这么做的
- 根据最新标记创建本地分支:git checkout -B branchforv1.73.0 v1.72.0
- cherry-pick commit 8和commit 9
- 创建新标签:git标签v1.73.0
那么现在,如何将v1.73.0推送到master?
结果:
- commit10(master)
- 提交7
- 提交9 v1.73.0
- 提交8
- 提交6 v1.72.0
- 提交5
- commit4 v1.71.0
- 提交3
- 提交2
- 提交1
5条答案
按热度按时间3pvhb19x1#
标签工作原理
在git中,每个标签都被称为“指向”一个(一个,单个)提交。事实上,分支也是如此:分支名称 also 仅指向一个提交。
是什么让这个工作是两件事:
因此,分支和标记之间的主要区别在于标记不会移动。
要了解这是如何工作的,考虑一个只有三次提交的简单git仓库。让我们将这些提交标记为
A
,B
和C
。第一次提交(A
)没有指向任何内容,因为它是第一次提交,分支master
指向A
:当你进行第二次提交时,git创建了指向
A
的B
,并将分支名称前进到指向B
:然后当你进行第三次提交时,git再次让它指向它的父提交,并推进分支:
如果你现在创建一个标签,默认情况下,该标签将指向commit
C
:如果你提交了一个新的提交
D
,git会推进 * 分支 *,但不会推进tag:您可以在任何时候创建或删除指向任何特定提交的任何标记:
将删除标记
sometag
,之后:将添加指向提交
B
的sometag
.1(We我刚刚证明了标签可以移动。真实的的区别是标签不应该移动,而分支可以;git不会自动移动标签。2分支通常会“向前”移动,也就是说,如果
master
过去指向commitC
,现在指向commitD
,则commitC
通常应该从D
开始向后查找。任何时候你移动一个分支,违反了这个规则,你在“改写历史”;看其他文章,什么时候这样做是好的,什么时候它给人们带来麻烦。)推送标签
当你使用
git push
时,你实际上是在指示其他git仓库接受你拥有的任何新提交,然后设置一些名称(s)-通常是分支和/或标签-指向一些提交(每个)在结果集合中。3这些名称(分支、标记等)通常被称为“引用”,但我们现在只使用“分支”和“标记”。git push
后面的参数命名存储库(通常通过一个“远程”名称,比如origin
)到push-to。如果你不使用它,git会尝试找出一个,但是如果你想添加一个分支或标签名称,你需要显式地包含它,因为这里的第一个单词被假设为remote-name。(也就是说,git push master
尝试使用master
作为远程名称而不是分支名称。要推送 * 所有 * 标签,您只需将
--tags
添加到git push
命令中:要推送一个 specific 标签,可以将其命名为:
就像您可以推送特定分支一样:
(In事实上,第四个参数是一个 * 对 * 的名称,如
master:master
或sometag:sometag
,但在大多数情况下,它默认在两端使用相同的名称。如果不需要
origin
作为所有参数,可以省略它,例如git push --tags
与git push --tags origin
相同(假设所有推送都转到origin
)。把它放在一起
要在远程设置标签,首先使用
git tag *name**commit-identifier*
在本地设置标签。使用您喜欢的任何查看器来确保它设置正确。然后使用git push origin *name*
或git push --tags
推送它。1x 1 m35n1x语法指示git从通过
master
找到的提交开始,然后后退两步。你可以在这里写提交B
的原始SHA-1。2旧版本的git(1.8.4之前)在推送时意外地将分支规则应用于标签(在远程端,即如果标签是“快进”,它们会让标签移动)。
3在某些情况下,您可以将名称指向“注解标记”,并且没有任何东西可以阻止名称指向“树”或“blob”对象,但这不是正常的设置。
4实际上,分支的默认 dst refspec很复杂:这取决于您的
push.default
配置,以及是否有remote.*repository*.push
设置,以及是否有上游配置,等等。对于标签,规则更简单,因为没有“上游”这样的东西。ar7v8xwq2#
下面是一个具体的例子:
s1ag04yj3#
这就是你想要的
egmofgnx4#
创建标记后(看起来您已经完成了),只需运行
gdx19jrr5#
创建一个标签很简单,这里有一个命令:
示例:
其中
7cceb02
是提交id的开始部分。然后可以使用
git push origin v1.0
推送标记。你可以使用
git log
来显示当前分支中的所有提交id。