假设我的gerrit中的当前日志如下所示:
- 提交10(主(
- 提交9
- 提交8
- 提交7
- 提交6 v1.72.0
- 提交5
- 提交4 v1.71.0
- 提交3
- 提交2
- 提交1
我的目标是创建一个应该包含 commit8 和 commit9 的新标签 (v1.73.0(,并将其推送到原点。我被告知要根据最新的稳定标签创建一个新的本地分支,并挑选必要的提交并标记它。但是,我在将标签推到主控时遇到了一些问题。
这是我所做的:
- 基于最新标签创建本地分支:git checkout -b 分支 v1.73.0 v1.72.0
- 挑选提交 8 和提交 9
- 创建新标签:git 标签 v1.73.0
。那么现在,如何推送 v1.73.0 到主控呢?
结果:
- 提交10(主(
- 提交7
- 提交9 v1.73.0
- 提交8
- 提交6 v1.72.0
- 提交5
- 提交4 v1.71.0
- 提交3
- 提交2
- 提交1
标签的工作原理
在 git 中,每个标签都被称为"指向"一个(一个,单个(提交。 事实上,分支也是如此:分支名称也只指向一个提交。
使这项工作成为这项工作的两件事:
- 每个提交还指向另一个提交(或可能是几个(,并且
- 对于分支(并且仅适用于分支(,分支指向的提交会自动"向前移动"。 也就是说,当你添加新的提交时——在某些方面,这基本上就是 git 所做的一切:将新的提交添加到它的集体中,有点像旧《星际迷航》TNG 系列中的 Borg——无论你在哪个分支上,这个分支都会被重新调整以指向新的提交。
因此,分支和标签之间的主要区别在于标签不会移动。
要了解其工作原理,请考虑一个简单的 git 存储库,其中只有三个提交。 让我们将这些提交标记为A
、B
和C
。 第一次提交(A
(不指向任何内容,因为它是第一次提交,分支master
指向A
:
A <-- master
当你进行第二次提交时,git 会创建指向 A
的B
,并将分支名称推进到指向B
:
A <- B <-- master
然后,当您进行第三次提交时,git 再次使其指向其父提交,并推进分支:
A <- B <- C <-- master
如果您现在创建一个标记,默认情况下,该标记将指向提交C
:
A <- B <- C <-- master
^
|
tag: sometag
如果你随后创建一个新的提交D
,git 会推进分支,但不推进标签:
A <- B <- C <- D <-- master
^
|
tag: sometag
您可以随时创建或删除指向任何特定提交的任何标签:
$ git tag -d sometag
将删除标签sometag
,之后:
$ git tag sometag master~2
将添加指向提交B
的sometag
。1
(我们刚刚证明了标签可以移动。 真正的区别在于标签预计不会移动,而分支会移动;Git 不会自动移动标签。2 分支通常期望向"向前"方向移动,即,如果master
过去指向提交C
,现在指向提交D
,则通常应通过从D
开始并向后工作来找到提交C
。 任何时候你移动分支以违反这条规则,你就是在"重写历史";请参阅其他文章,了解何时可以,以及何时给人们带来麻烦。
推送标签
当你使用 git push
时,你真正要做的是指示其他一些 git 存储库接受你没有的任何新提交,然后设置一些名称(通常是分支和/或标签(来指向结果集合中的一些提交(每个提交一个(。3 这些名称(分支、标签等(通常称为"引用",但现在我们只使用"分支"和"标签"。
git push
后面的参数命名存储库(通常通过"远程"名称,如origin
(以推送。 如果你省略它,git 会尝试找出一个,但如果你想添加一个分支或标签名称,你需要明确包含它,因为这里的第一个单词被假定为远程名称。 (也就是说,git push master
尝试将master
用作远程名称而不是分支名称。
要推送所有标签,您只需将--tags
添加到git push
命令中即可:
git push --tags origin
要推送特定标签,您可以将其命名为:
git push origin sometag
就像您可以推送特定分支一样:
git push origin master
(事实上,第四个参数是一对名称,如 master:master
或 sometag:sometag
,但在大多数情况下,它默认在两边使用相同的名称。4(
如果您不需要它来制作所有参数,您可以省略名称origin
,例如,git push --tags
与git push --tags origin
相同(假设您所有的推送都转到origin
,无论如何(。
把它放在一起
要在远程中设置标签,请先使用 git tag name commit-identifier
在本地设置标签。 使用您喜欢的任何查看器来确保其设置正确。 然后用git push origin name
或git push --tags
推动它。
1master~2
语法指示 git 从通过 master
找到的提交开始,然后备份两个步骤。 您可以在此处编写用于提交B
的原始 SHA-1。
2旧版本的 git(1.8.4 之前(在推送时意外地将分支规则应用于标签(在远程端,即,如果标签是"快进",它们会让标签移动(。
3在某些情况下,您可以将名称指向"带注释的标签",并且没有什么可以阻止名称指向"树"或"blob"对象,但这不是正常的设置。
4实际上分支的默认 dst refspec 很复杂:这取决于您的push.default
配置,以及是否有remote.repository.push
设置,以及是否有上游配置等等。 对于标签,规则更简单,因为没有"上游"这样的东西。
下面是一个具体的例子:
git add .
git commit -m "some description"
git tag v0.1.9 # or any other text
git push origin master # push the commit
git push --tags origin # push the tags
<</div>
div class="one_answers"> 这就是你想要的
git add .
git commit -m "commit10"
git tag -a v1.73.0 -m "Latest release (or some message)"
git push origin master
git push origin v1.73.0
创建标签后(看起来您已经完成了(,只需运行
git push --tags origin
创建标签很简单,这里有一个命令可以做到这一点:-
例:
git tag -a v1.0 7cceb02 -m "Your message here"
其中7cceb02
是提交 ID 的开头部分。
然后,您可以使用 git push origin v1.0
推送标记。
您可以执行git log
以显示当前分支中的所有提交 ID。