是否使用git push --tags指定refspec之间的区别

时间:2018-11-21 16:12:26

标签: git git-push

我偶然发现了一个相当模糊的问题,即使用两个命令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试图将某些东西从标签中推开? 我在问为什么命令试图将分支推送到远程,而不是为什么它被拒绝

1 个答案:

答案 0 :(得分:1)

  

我问的是为什么命令试图将分支推送到远程,而不是为什么它被拒绝,

因为git push将推送新的提交和(带有--tags的)新标签。

  • C已经被推入,所以没有什么可以推入那里
  • 新标签被推送。

在第二种情况下,您尝试将远程主分支(位于D处)重置为C(除了推送标记)。