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

azn*_*key 21 tags git commit

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

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

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

这就是我所做的:

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

...现在,我如何推动v1.73.0掌握?

结果:

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

tor*_*rek 55

标签如何工作

在git中,每个标记都被称为"指向"(一个,单个)提交.事实上,分支也是如此:分支名称只指向一个提交.

这项工作的原因有两个:

  • 每个提交也指向另一个提交(或者可能是几个),和
  • 对于分支(并且用于分支),分支指向的提交自动"向前移动".也就是说,当你以某种方式添加新提交时,大多数git都会这样做:向集合添加新提交,有点像旧星际迷航TNG系列中的Borg - 无论你在哪个分支,那就是分支重新调整以指向新提交.

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

要了解其工作原理,请考虑一个只有三次提交的简单git存储库.让我们来标注这些提交A,BC.第一个commit(A)指向什么,因为它是第一个提交,而分支master指向A:

A   <-- master
Run Code Online (Sandbox Code Playgroud)

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

A <- B   <-- master
Run Code Online (Sandbox Code Playgroud)

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

A <- B <- C   <-- master
Run Code Online (Sandbox Code Playgroud)

如果您现在制作标签,默认情况下该标签将指向提交C:

A <- B <- C   <-- master
          ^
          |
   tag: sometag
Run Code Online (Sandbox Code Playgroud)

如果你然后进行新的提交D,git会提升分支,但不会提升标记:

A <- B <- C <- D   <-- master
          ^
          |
   tag: sometag
Run Code Online (Sandbox Code Playgroud)

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

$ git tag -d sometag
Run Code Online (Sandbox Code Playgroud)

将删除标签sometag,之后:

$ git tag sometag master~2
Run Code Online (Sandbox Code Playgroud)

将添加sometag指向提交B.1

(我们刚刚证明,一个标签可以移动的真正区别是标签不.预计移动,而分支;和Git不会自动移动的标签.2个 分行的普遍预期,"向前"的方向移动,即,如果master用于指向提交C,现在指向提交D,C通常应该通过开始D和向后工作找到提交.任何时候移动分支以便违反此规则,您将"重写历史记录";请参阅其他这篇文章很好,当它引起人们的麻烦时.)

推标签

当你使用时git push,你真正在做的是指示其他一些git存储库接受你没有的任何新提交,然后设置一些名称 - 通常是分支和/或标记 - 指向一些提交(最终各一个)产生的集合.3 这些名称(分支,标签等)通常称为"引用",但我们现在只使用"branch"和"tag".

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

要推送所有标签,只需添加--tags到您的git push命令:

git push --tags origin
Run Code Online (Sandbox Code Playgroud)

要推送特定标签,您可以为其命名:

git push origin sometag
Run Code Online (Sandbox Code Playgroud)

正如你可以推动一个特定的分支:

git push origin master
Run Code Online (Sandbox Code Playgroud)

(事实上​​,第四个参数是一名称,如master:mastersometag:sometag,但在大多数情况下默认使用两侧相同的名称.4)

origin如果你不需要它来制作所有的参数,你可以省略名称,例如,git push --tags相同git push --tags origin(假设所有的推动都去origin了).

把它放在一起

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


1master~2语法指示GIT中开始在提交经由发现master,然后备份两个步骤.您可以B在此处编写用于提交的原始SHA-1 .

2旧版本的git(pre 1.8.4)在推送时意外地将分支规则应用于标签(在远程端,即如果它是"快进"则让标签移动).

3在某些情况下,您可以将名称指向"带注释的标签",并且没有任何东西阻止名称指向"树"或"blob"对象,但这不是正常的设置.

4实际上,分支的默认dst refspec很复杂:它取决于您的push.default配置,是否有设置,是否配置了上游,等等.对于标签,规则更简单,因为没有"上游"这样的东西.remote.repository.push


qed*_*qed 24

这是一个具体的例子:

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
Run Code Online (Sandbox Code Playgroud)

  • `git push --tags origin` 已经推送了所有本地标签。我们可以指定我们想要推送的那个吗? (2认同)

YAS*_*KAR 5

这就是你想要的

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.
Run Code Online (Sandbox Code Playgroud)