如何创建具有某些提交的标签并将其推送到原点



假设我的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 存储库,其中只有三个提交。 让我们将这些提交标记为ABC。 第一次提交(A(不指向任何内容,因为它是第一次提交,分支master指向A

A   <-- master

当你进行第二次提交时,git 会创建指向 AB,并将分支名称推进到指向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

将添加指向提交Bsometag1

(我们刚刚证明了标签可以移动。 真正的区别在于标签预计不会移动,而分支会移动;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:mastersometag:sometag ,但在大多数情况下,它默认在两边使用相同的名称。4(

如果您不需要它来制作所有参数,您可以省略名称origin,例如,git push --tagsgit push --tags origin相同(假设您所有的推送都转到origin,无论如何(。

把它放在一起

要在远程中设置标签,请先使用 git tag name commit-identifier 在本地设置标签。 使用您喜欢的任何查看器来确保其设置正确。 然后用git push origin namegit 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。

最新更新