如何使用某些提交创建标记并将其推送到原点?

时间:2014-09-09 23:26:51

标签: git tags commit

说我的gerrit中的当前日志如下所示:

  • commit10(master)
  • commit9
  • commit8
  • commit7
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1

我的目标是创建一个应包含commit8和commit9的新标记(v1.73.0)并将其推送到origin。我被告知要根据最新的稳定标签创建一个新的本地分支,并挑选必要的提交并对其进行标记。但是,我在将标签推向掌握时遇到了一些问题。

这就是我所做的:

  • 根据最新标记创建本地分支:git checkout -b branchforv1.73.0 v1.72.0
  • cherry-pick commit8 and commit9
  • 创建新标签:git tag v1.73.0

...现在,如何将v1.73.0推送到掌握?

结果:

  • commit10(master)
  • commit7
  • commit9 v1.73.0
  • commit8
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1

5 个答案:

答案 0 :(得分:50)

标签如何工作

在git中,每个标签都被称为"指向"一个(一个)提交。实际上,分支也是如此:分支名称​​也只指向一个提交。

使这项工作成为两件事:

  • 每个提交也指向另一个提交(或者可能是几个)和
  • 表示分支(表示分支),分支指向的提交"向前移动"自动。也就是说,当你在某些方面添加新的提交时,大多数git都会这样做:向其集体添加新提交,有点像旧星际迷航TNG系列中的Borg-无论你是什么分支on,那个被重新调整为指向新提交的分支。

因此,分支和标签之间的主要区别在于标签不会移动。

要了解其工作原理,请考虑一个只有三次提交的简单git存储库。让我们为这些提交ABC添加标签。第一次提交(A)指向任何内容,因为它是第一次提交,而分支master指向A

A   <-- master

当您进行第二次提交时,git会创建指向B的{​​{1}},并将分支名称前进到指向A

B

然后当你进行第三次提交时,git再次指向它的父提交,并推进分支:

A <- B   <-- master

如果您现在制作代码,默认情况下,该代码将指向提交A <- B <- C <-- master

C

如果您再进行新的提交A <- B <- C <-- master ^ | tag: sometag ,git将推进分支,而不是标记:

D

您可以随时创建或删除任何指向任何特定提交的标记:

A <- B <- C <- D   <-- master
          ^
          |
   tag: sometag

将删除标记$ git tag -d sometag ,之后:

sometag

将添加$ git tag sometag master~2 指向提交sometag 1

(我们刚刚证明了标签可以移动。真正的区别在于标签不是预期移动,而分支是;并且git赢了& #39; t自动移动标签。 2 分支通常预期在&#34; forward&#34;方向移动,即,如果B用于指向提交{{1现在指向提交master,通常应该从C开始并向后工作找到提交D。每当你移动一个分支以便违反此规则时,你&# 39;重写&#34;重写历史&#34;;查看其他文章,了解何时可以,以及什么时候会引起人们的麻烦。)

推送标签

当您使用C时,您真正在做的是指示其他一些git存储库接受您不具备的任何新提交,然后设置一些名称 - 通常是分支和/或标记 - 指向生成的集合中的一些提交(每个一个)。 3 这些名称(分支,标签等)被称为&#34;引用&#34;总的来说,让我们使用&#34; branch&#34;和&#34;标记&#34;现在。

D之后的参数命名存储库(通常通过&#34;远程&#34;名称,如git push)来推送。如果你把它留下来,git会尝试找出一个,但如果你想添加一个分支或标签名称,你需要明确地包括它,因为这里的第一个单词被假定为远程名称。 (也就是说,git push尝试使用origin作为远程名称而不是分支名称。)

要推送所有您的代码,您只需将git push master添加到master命令:

--tags

要推送特定的标记,您可以将其命名为:

git push

正如您可以推送特定分支一样:

git push --tags origin

(事实上,第四个参数是名称的,例如git push origin sometag git push origin master ,但在大多数情况下,默认情况下两边都使用相同的名称 4

如果你不需要它来制作所有参数,你可以省略名称master:master,例如,sometag:sometagorigin相同(假设你所有的推动无论如何,请转到git push --tags

把它放在一起

要在遥控器中设置标签,请先使用git push --tags origin在本地设置标签。使用您喜欢的任何查看器以确保正确设置。然后使用origingit tag name commit-identifier推送它。


1 git push origin name语法指示git从通过git push --tags找到的提交开始,然后备份两个步骤。您可以在此处为提交master~2编写原始SHA-1。

2 旧版本的git(1.8.4之前版本)在推送时意外地将分支规则应用于标签(在远程端,即如果标签是&#34,它们会让标签移动;快进&#34;)。

3 在某些情况下,您可以将名称指向&#34;带注释的标签&#34;,并且没有任何阻止名称指向&#34;树&#34;或者&#34; blob&#34;也可以是对象,但这不是正常的设置。

4 实际上,分支的默认 dst refspec很复杂:它取决于您的master配置,以及是否有B设置,是否有上游配置,等等。对于标签,规则更简单,因为没有&#34;上游&#34;。

答案 1 :(得分:14)

这是一个具体的例子:

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

答案 2 :(得分:2)

一旦你创建了标签(看起来你已经完成了),只需运行

即可
git push --tags origin

答案 3 :(得分:1)

这就是你想要的

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.

答案 4 :(得分:0)

创建标签很简单,下面是一个命令:-

示例:

git tag -a v1.0 7cceb02 -m "Your message here"

其中 7cceb02 是提交 ID 的开始部分。

然后您可以使用 git push origin v1.0 推送标签。

您可以执行 git log 以显示当前分支中的所有提交 ID。