如果在分支内工作,为什么git push需要其他参数?

时间:2018-12-10 16:17:56

标签: git

我做到了

git checkout -b NEW_BRANCH

在所有提到的地方,为了将其推送到远程,都必须告诉push命令一些其他信息

git push origin NEW_BRANCH

,或者必须将本地分支与远程分支相关联

git branch --set-upstream origin NEW_BRANCH

我都不明白这两个需求。换句话说,我不理解其他命令的作用吗?这些是什么?或者,如果只是说

git push

? 在以上两个命令中,NEW_BRANCH是引用本地分支名称还是引用远程分支名称(如果有区别)?

3 个答案:

答案 0 :(得分:0)

因为尚未将本地分支与远程分支关联。

请注意,远端和本地端的分支命名不必一对一相同。

在您的本地状态下,您的分支机构“链接”到上游分支机构。它只需要“建立该链接”。

要查看哪个分支“链接”(跟踪)哪个远程分支的状态,可以使用(如果您的远程名为origin):

git remote show origin

答案 1 :(得分:0)

  

我都不明白这两个需求。换句话说,我不   了解其他命令的效果?他们是什么?

我假设您正在谈论以下命令:git push <remote-name> <branch-name>。您也可以只做git push

git是一个分布式版本控制系统。因此,您可能有多个遥控器(甚至零个遥控器)。通俗地说,origin是克隆后给遥控器的名称(您可以重命名或删除它,这无关紧要)。希望这可以说服您为什么(可能)需要指定遥控器。如果您有7个遥控器,则git无法知道您要推送到哪个遥控器。如果仅执行origin,则git push是默认的远程服务器。

git也不知道要推送哪个分支。您可以有很多分支。因此,合乎逻辑的是,您可能要推送一些而不是其他邮件,因此是<branch-name>参数的原因(从技术上讲,是refspec,它是分支的超集)。作为快捷方式,您可以将HEAD指定为要推送的提交(HEAD是指向当前提交的指针)。因此,您可以说git push origin HEAD,如果您的分支名称很长,这特别方便。同样,git push将默认情况下推送当前分支,前提是它具有匹配的上游分支。否则,您必须手动推动(git push origin HEAD)来创建上游分支,然后准系统git push对该分支开始起作用,或者您也可以手动将其设置为上游分支--set-upstream

Mandatory docs link

HTH。

答案 2 :(得分:0)

正确答案有多个部分,这就是为什么如此令人困惑的原因。为了正确理解这一点,让我们先定义一些术语:

  • 远程是一个简单的名称,例如originupstream。此名称使Git可以存储一个URL(从技术上讲,是一个或多个URL,但通常只是一个URL),因此您无需键入https://user@host.dom.ain/some/fairly/long/path/to/some/other/repo.git或类似名称,而只需键入origin

    Git有一个内置的或多或少标准的,名为origin的远程服务器,它由git clone创建,并自动记住您运行git clone时使用的URL。

  • 引用 ref 是用于引用提交的内容,例如分支名称或标记名称,例如master或{{ 1}}。引用的格式很长:例如develop实际上是master。大多数时候,您可以只使用短格式而不必担心,但是长格式在那里,并且是Git内部使用的,用于处理棘手的情况,例如,如果您不小心制作了 tag { {1}}。 (不要故意这样做,但是如果您误操作了,长格式将始终让您修复问题。)

  • refspec 本质上是一对用冒号refs/heads/master字符分隔的引用。例如,master和ref :都是refspec。但这是refspec的一种更复杂的形式:在很多情况下,您可以删除冒号和第二个名字,在这种情况下,看起来就像是引用。

master:master所需要的依次是一个远程和一个或多个 refspecs

这反过来意味着您的问题的答案:

refs/heads/develop:refs/heads/develop
     

... NEW_BRANCH是指本地分支名称还是远程分支名称(如果有区别)?

实际上有点复杂,因为git push毕竟不是分支的名称,而是 refspec 。它看起来像一个分支名称!

git push origin NEW_BRANCH 的作用是调用另一个Git。另一个Git在URL上“存在”(或至少应答您的Git拨打的互联网电话),您的Git通过查找遥控器找到了该URL。然后,两个Git进行对话,您的Git会找出他们的Git提交的内容,并在需要时提供他们的Git new 提交,最后,要求 Git进行设置一些他们的分支名称,以记住在您的 Git存储库中找到的一些提交。 (至此,由于之间的对话,他们也有了这些提交,如果以前没有的话。)

因此,您在此处输入的NEW_BRANCH refspec 实际上是两个名称。当您使用带有冒号的表单时,可以使用两个不同的名称,甚至可以使用原始的哈希ID:

git push

其中包含您的Git提供的新提交,然后将 NEW_BRANCH设置为指向您的git push origin master:somebranch 所指向的相同提交,或:

somebranch

让您的Git确保他们已经提交了master,然后将 git push origin a123456:refs/heads/somebranch 设置为指向该特定提交。 1

  

我不了解是否需要[远程和refspec]

事实上,通常您不需要。您可能会认为这总是 的意思,但是由于多种历史原因,并不是这样。

首先,Git并不总是具有 remotes ,因此,您可以写一个URL代替远程名称。 2 如果使用远程或URL,Git将找出默认值(通常为a123456...)。但是,如果您需要列出refspec,则必须 提供一个远程或URL,因为remote-or-URL必须放在参数中的该位置。

第二,Git 用于,默认情况下使用过于热情的默认refspec一次推送多个分支。今天,它默认使用理智的refspec推送一个分支。这应该并且确实要使它不需要refspec,而仅在满足某些条件时才需要。并且,您可以使用somebranch 更改此默认值;如果这样做,将更改您可以省略refspec的条件,从而也可以省略远程名称。

使用今天默认的origin push.default,Git将自动找出并使用正确的远程和refspec if:

  1. 当前分支具有上游集,并且
  2. 上游在远程上为相同名称的分支命名。

此处的远程可以是您的任何远程:如果分支push.default的上游是simple,则远程是xyz,而foo/xyz上的分支是{{ 1}},因此同时满足条件1和2,foo会做正确的事情。

首次创建新分支时,其上游设置(如果有)取决于创建该分支的方式。使用foo为您提供了一个新分支 xyz ,默认情况下上游没有 。使用git push为您提供了一个新分支 git checkout -b name ,该分支具有 name 作为上游分支,并且设置了许多其他选项一些上游。


1 如果使用此表格,通常必须拼出完整的参考名称。原因是,当您使用诸如git checkout --track remote/name之类的缩写名称时,Git会扫描您对弄清楚的引用,例如name是否是分支名称或标签名称。这可以让您的Git告诉他们的Git:设置您的裁判/头部/ x234 (分支)或设置您的裁判/标签/ x234 (标签)。

2 在那些非常老的Git版本中,您总是必须提供URL。如您所想,这有点痛苦。这导致了几次实验,最终产生了 remote 的想法,并且一旦有了名为remote/name standard 遥控器,就可以省略遥控器完全可以,只要您还可以省略所有refspec。

所有实验也都得到支持。您可以使用git push origin x234加上x234条目将origin映射到主机名及其中的可选路径。