git push --tag保持提交

时间:2015-05-18 11:47:20

标签: git git-branch git-tag

当推送到主人时,我读到建议使用:

git tag -a <tag name> -m <message> ; git push --tags

我添加了一个新标记,并将更改推送到主文件,现在我修改了另一个文件,并希望将其推送到具有相同标记的主文件。

我做:git push --tags -f,我得到了#34;一切都是最新的&#34;信息。但是,当我这样做时:git status我仍然看到:&#34;你的分支领先于原产地/大师&#39;由2个提交&#34;

为什么会这样?我需要做些什么来为标签添加新的更改?

3 个答案:

答案 0 :(得分:1)

你需要推进

git push --all

如果有新标签,请使用:

git push --all; git push --tag

不是git push --tags--tags将推送标签的所有引用,而不是主分支上的提交。我不知道你在哪里读过这个建议,但不经常标记不是真的鼓励。通常,当您拥有软件的新版本时,请标记。换句话说,这是一个重要的里程碑。不是普通的提交。

此外,我强烈建议不要自动使用-f(也称为--force)标志(完全)。如果存储库不同步,最好不要强制提交共享存储库。如果有警告,您必须尝试解决它们,而不是立即否决这些警告。

一般建议是学会使用工具,而不是按照几个步骤,而不会意识到幕后的内容。

修改

第二次添加标记时可能会收到错误:

fatal: tag 'foo' already exists

foo标签的名称)。正如声明所说,你不能简单地用相同的名称标记两次。 git push --tags将内容提交至该标记。由于您为标记分配了先前的提交,因此您将推送到该提交,而不是最新的提交。你可以做一些事情:

  • 使用其他代码(推荐)并使用git push --tags;
  • 进行推送
  • 重复使用代码并强制标记git tag -f -a <tag name> -m <message>。在这种情况下,旧标签将被删除。而且git push --tags会奏效。问题是通常使用标签来指定版本。用户可能会说: aha,最新版本为release-2.3,我不必更新软件,而新release-2.3与旧版本不同。使用release-2.3-fix0进行注释可能会让他们意识到您修复了某些内容。
  • 使用git push --all将提交推送到所有分支的负责人。

<强>背景

您可以看到您的提交图:

A -- B -- C -- D
         /
      <tag>

如果您致电git push --tag,它会同步ABC,因为这是<tag>监督下的最后一次提交。如果您重新加注,则会将代码分配给D

答案 1 :(得分:1)

运行git push时,会发生以下几种情况:

  1. 一些提交被发送到远程存储库
  2. 远程分支(例如远程计算机上的master)已更新为指向最新提交
  3. 更新远程跟踪分支(例如本地计算机上的origin/master)以反映远程分支上的更改
  4. 通过指定--tags,您可以修改行为以仅更新标记引用(以及您可能在命令行中指定的其他一些引用,但您没有这样做)。如果您标记了最新的提交,那么此提交及其所有祖先都被推送,但您没有完成上面的步骤2和3。结果

    • 查看您的远程存储库的用户将看到该标记,但会看到该分支有些提交
    • 由于git status使用远程跟踪分支来确定您是否位于遥控器之前,它会告诉您自己位于遥控器之前。

    最简单的解决方案是进行两次推送:

    • git push像往常一样推送你的分支(由push.default指定,即如果它与最近的Git具有相同的名称,则将当前分支推送到配置的上游)
    • 创建标记后,git push --tags推送您的标记(因为提交已经被推送几乎没有时间,Git只需要在远程存储库上创建标记)

    如果您想同时执行这两项操作,请查看问题Push git commits & tags simultaneously的答案。

    请注意,没有理由为推送每个创建一个标记。通常,人们只为发布创建标签。

答案 2 :(得分:0)

git push --tag只推送标签,而不是提交。