我做到了
git checkout -b NEW_BRANCH
在所有提到的地方,为了将其推送到远程,都必须告诉push命令一些其他信息
git push origin NEW_BRANCH
,或者必须将本地分支与远程分支相关联
git branch --set-upstream origin NEW_BRANCH
我都不明白这两个需求。换句话说,我不理解其他命令的作用吗?这些是什么?或者,如果只是说
git push
? 在以上两个命令中,NEW_BRANCH是引用本地分支名称还是引用远程分支名称(如果有区别)?
答案 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
。
HTH。
答案 2 :(得分:0)
正确答案有多个部分,这就是为什么如此令人困惑的原因。为了正确理解这一点,让我们先定义一些术语:
远程是一个简单的名称,例如origin
或upstream
。此名称使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:
此处的远程可以是您的任何远程:如果分支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
映射到主机名及其中的可选路径。