我想让自己了解git的标记。据了解,标记用于标记开发中的某些点。
据我所了解的文档,我不了解的是,对于同一版本或远程和本地版本,可以具有完全不同的标签。
假设我正在提交我的版本,并且将其标记为
git tag v0.0.1 master
本地。
现在,我将把本地提交推送到远程仓库。而且由于我可能度过了糟糕的一天,所以我用像这样的错字弄乱了我的远程标签
git push origin master v0x.0.3
稍后有几次提交,由于打字错误,我找不到远程提交v0.0.1。
我无法告诉git在远程仓库上使用我在本地使用的标签吗?
答案 0 :(得分:2)
听起来您是在说,当您执行该推送时,您认为它将在master
上创建一个新的远程标签,其名称与本地标签的名称不同。那是不对的。
如果存在名为v0x.0.3
的引用,它将按原样推送(不是必定指向master
)。如果不是这样(在您建议的命令示例所建议的随机胖指情况下,很可能会发生),这将导致push
命令错误并显示一条消息,提示它不知道什么v0x.0.3
是。
现在,您可以 确实在提交上创建本地标签,而与远程控制器指向该提交的任何标签无关。为此,您可以让任意数量的本地标记都指向同一提交,而与远程共享或不共享任何数量。
如果您实际上想要在遥控器上创建其他名称的标签,则可以;但是我一秒钟都不相信你会不小心做。
git push origin local_tag_name:remote_tag_name
(因为local_tag_name是一个标签,所以git会推断您也希望remote_tag_name也是一个标签,但是您必须竭尽全力来更改名称);或
git push origin master:refs/tags/remote_tag_name
(您明确表示要在遥控器上创建新标签)。
还有 个用例,您可能想这样做。在几乎所有情况下,git都提供了执行所需内容的灵活性,然后提供了易于使用的命令来执行大多数人大部分时间想要的操作。因此,您可以在遥控器上创建不同标签名称的观察是正确的;但这并不意味着您必须或应该,或者将被意外地欺骗这样做。
使它与git概念保持一致:尽管您似乎将标记视为提交的属性,但事实并非如此。这是它自己的事情(碰巧引用了commit [1]);该东西可能存在或可能不存在于任何给定的回购中。如果它在本地存在,则可以(但不必)将其推到远程位置;并且如果它存在于远程站点中,则可以(但不必)将其获取到本地。
[1]实际上,标签恰好指向某个对象,该对象通常是一个提交,但也可能是其他东西,例如特定文件