git push --tag 保持提交

git push --tag keeps commits

推送给master的时候,看了推荐使用:

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

我添加了一个新的标签,并推送了更改到master,现在我修改了另一个文件,想用相同的标签将它推送到master。

我这样做:git push --tags -f,我收到 "Everything up-to-date" 消息。但是当我这样做时:git status 我仍然看到:"Your branch is ahead of 'origin/master' by 2 commits"

为什么会这样?我需要做什么才能将新更改添加到标签?

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

你需要用

推送
git push --all

如果有新标签,则:

git push --all; git push --tag

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

此外,我强烈反对(完全)自动使用 -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 会起作用。问题是通常使用标签来指定发布。用户可能会说:啊哈,最新版本是release-2.3,我不需要更新软件,而新的release-2.3与旧的不同。用 release-2.3-fix0 注释可能会让他们知道你修复了一些东西。
  • 使用git push --all将提交推送到所有分支的头部。

背景

您可以看到您的提交图:

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

如果您调用 git push --tag,它将同步 ABC,因为这是 <tag> 监督下的最后一次提交。如果您重新标记,标记将改为分配给 D

当您 运行 一个 git push 时,会发生几件事:

  1. 一些提交被发送到远程存储库
  2. 远程分支(例如远程机器上的 master)更新为指向最新的提交
  3. 远程跟踪分支(例如本地计算机上的 origin/master)已更新以反映远程分支上的更改

通过指定 --tags,您可以修改行为以仅更新标签引用(加上您可能已在命令行中指定但您没有指定的其他一些引用)。如果你标记了最新的提交,那么这个提交和它的所有祖先都被推送了,但是你没有完成上面的步骤 2 和 3。结果

  • 查看您的远程存储库的用户会看到标签,但会看到一些提交后面的分支
  • 由于git status使用remote-tracking分支判断你是否领先于remote,它会告诉你你领先于remote。

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

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

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

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