使用 git push --tags 或不指定 refspec 的区别

Difference between specifying refspec with git push --tags or not

我偶然发现了这个相当晦涩的问题,使用 git push --tagsgit push --tags origin master 这两个命令将标签推送到远程。它们在以下情况下的行为不同:

初始情况

我正在尝试将一个新创建的标签 (git tag test) 推送到一个提前提交的远程仓库,因为其他人向它推送了一个提交,而我没有提取最新的更改。如图所示:

Remote [master] (one commit ahead):
A ----- B ----- C ---- D
Local  [master] (one commit behind):
A ----- B ----- C 
            (tag:test)

问题

git push --tags 正在按预期工作:

Total 0 (delta 0), reused 0 (delta 0)
To https://remote.gitrepo.com/path/to/project
 * [new tag]         test14 -> test14

git push --tags origin master 被拒绝并出现错误:

Total 0 (delta 0), reused 0 (delta 0)
To https://remote.gitrepo.com/path/to/project
  * [new tag]         test15 -> test15
  ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://remote.gitrepo.com/path/to/project'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

问题

为什么 git push --tags origin master 试图将某些东西从标签中推开? 我问的是为什么命令试图将分支推送到远程而不是为什么它被拒绝

I am asking why the command is trying to push the branch to the remote and not why it is being rejected,

因为git push 将推送新提交和(使用--tags)新标签。

  • C 已经被推送所以没有什么可推送的
  • 新标签已推送。

在你的第二种情况下,你试图将远程主分支(位于 D)重置为 C(除了推送标签)。