git 我如何创建带有特定提交的标签并将其推送到origin?

d4so4syb  于 2023-04-19  发布在  Git
关注(0)|答案(5)|浏览(131)

假设我的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
3pvhb19x

3pvhb19x1#

标签工作原理

在git中,每个标签都被称为“指向”一个(一个,单个)提交。事实上,分支也是如此:分支名称 also 仅指向一个提交。
是什么让这个工作是两件事:

  • 每个提交还指向另一个提交(或者可能是多个),并且
  • 对于分支(only 对于分支),分支所指向的commit会自动“向前移动”。也就是说,当你添加新的commit时-在某些方面,这就是git所做的:添加新的提交到它的集体中,有点像老的星星迷航TNG系列中的博格-无论你在哪个分支上,那个分支都会被重新调整以指向新的提交。

因此,分支和标记之间的主要区别在于标记不会移动。
要了解这是如何工作的,考虑一个只有三次提交的简单git仓库。让我们将这些提交标记为ABC。第一次提交(A)没有指向任何内容,因为它是第一次提交,分支master指向A

A   <-- master

当你进行第二次提交时,git创建了指向AB,并将分支名称前进到指向B

A <- B   <-- master

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

A <- B <- C   <-- master

如果你现在创建一个标签,默认情况下,该标签将指向commit C

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

如果你提交了一个新的提交D,git会推进 * 分支 *,但不会推进tag:

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

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

$ git tag -d sometag

将删除标记sometag,之后:

$ git tag sometag master~2

将添加指向提交Bsometag .1
(We我刚刚证明了标签可以移动。真实的的区别是标签不应该移动,而分支可以;git不会自动移动标签。2分支通常会“向前”移动,也就是说,如果master过去指向commit C,现在指向commit D,则commit C通常应该从D开始向后查找。任何时候你移动一个分支,违反了这个规则,你在“改写历史”;看其他文章,什么时候这样做是好的,什么时候它给人们带来麻烦。)

推送标签

当你使用git push时,你实际上是在指示其他git仓库接受你拥有的任何新提交,然后设置一些名称(s)-通常是分支和/或标签-指向一些提交(每个)在结果集合中。3这些名称(分支、标记等)通常被称为“引用”,但我们现在只使用“分支”和“标记”。
git push后面的参数命名存储库(通常通过一个“远程”名称,比如origin)到push-to。如果你不使用它,git会尝试找出一个,但是如果你想添加一个分支或标签名称,你需要显式地包含它,因为这里的第一个单词被假设为remote-name。(也就是说,git push master尝试使用master作为远程名称而不是分支名称。
要推送 * 所有 * 标签,您只需将--tags添加到git push命令中:

git push --tags origin

要推送一个 specific 标签,可以将其命名为:

git push origin sometag

就像您可以推送特定分支一样:

git push origin master

(In事实上,第四个参数是一个 * 对 * 的名称,如master:mastersometag:sometag,但在大多数情况下,它默认在两端使用相同的名称。
如果不需要origin作为所有参数,可以省略它,例如git push --tagsgit 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设置,以及是否有上游配置,等等。对于标签,规则更简单,因为没有“上游”这样的东西。

ar7v8xwq

ar7v8xwq2#

下面是一个具体的例子:

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
s1ag04yj

s1ag04yj3#

这就是你想要的

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
egmofgnx

egmofgnx4#

创建标记后(看起来您已经完成了),只需运行

git push --tags origin
gdx19jrr

gdx19jrr5#

创建一个标签很简单,这里有一个命令:
示例:

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

其中7cceb02是提交id的开始部分。
然后可以使用git push origin v1.0推送标记。
你可以使用git log来显示当前分支中的所有提交id。

相关问题