问题描述
我有一个关于git的问题.假设我用此代码克隆了我的项目
git clone ssh://git@<my-project.git>
然后执行类似这样的行来添加远程上行链路
git remote add upstream ssh://git@<my-project.git>
当我尝试运行此行时,我已验证是否已设置上游
$ git remote -v
origin ssh://git@<my-project.git> (fetch)
origin ssh://git@<my-project.git> (push)
upstream ssh://git@<my-project.git> (fetch)
upstream ssh://git@<my-project.git> (push)
所以我从主目录创建了一个新分支
git checkout -b sample-branch master
Switched to a new branch 'sample-branch'
但是,当我尝试推送我的本地分支机构时,出现错误。
git push
fatal: The current branch sample-branch has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin sample-branch
可能我在想,既然我已经添加了上游,我的本地分支机构就不需要把我的上游设置好还是我想错了?我必须先执行上面的行,然后才能执行git push
后续命令。
推荐答案
有关TL;DR版本,请参阅VonC's answer。
git remote add
添加远程。虽然按照惯例,origin
是第一个名称,而upstream
通常是第二个名称,但是您可以使用您喜欢的任何名称。但通常情况下,如果您添加第二个遥控器,它将具有不同的URL,而不是相同的URL。如果您与多个不同的Git存储库通信,每个Git存储库位于不同的URL,则只需要多个遥控器。
令人困惑的是,名为upstream
的遥控器(假设您有一个)不是上游遥控器,它只是一个遥控器。
术语上游应用于分支机构名称时,指的是内部由两部分组成的设置(如VonC said)。每个分支名称(如master
或feature
)可以有一个上游名称,也可以没有上游名称。通常,master
的上游是origin/master
,feature
的上游是origin/feature
。如果您确实有多个远程,并将第二个远程调用为upstream
,则可以将branchX
的上游设置为upstream/branchX
。
so:分支的上游是其他名称,通常是以远程名称开头的名称。Git使用此设置来记住"那是我提取/拉出的位置"和"那是我推送到的位置"。但是,此名称必须实际存在,这才是事情真正令人困惑的地方。
从技术上讲,这会在您自己的Git存储库中创建一个新的分支名称,名为sample-branch
。此新分支名称选择的提交哈希ID与现有名称master
(也是分支名称)选择的提交哈希ID相同。当您使用这种git checkout
命令时,如果
origin/sample-branch
,则Git会将新分支的上游设置为另一个分支的名称。但是您可能没有和origin/sample-branch
。仅当位于origin
的Git(位于远程中名为origin
的URL)具有名为sample-branch
的分支时,此名称才会存在,并且您的Git已经看到并复制了它。由于您没有在此处使用origin/sample-branch
-如果您使用了,它无论如何都会失败-您的Git没有为新分支设置上游。您最终需要为此做点什么。没有必要马上做这件事!你想什么时候做就什么时候做。但最终,你确实需要这么做。涉及两个步骤:
您必须获取位于
origin
上的另一个Git,才能创建名为sample-branch
的分支。当您让Git创建其sample-branch
时,您的Git现在可以将其复制到您的origin/sample-branch
,以便您的origin/sample-branch
存在。一旦您的
origin/sample-branch
存在,您需要获取您的Git以将origin/sample-branch
设置为sample-branch
的上游。
您可以使用两个单独的Git命令
完成这个两步过程,而在古代,您必须这样做。不过,对于现代的Git版本,一个命令就足够了。该命令是git push -u origin sample-branch
。此操作的作用是:
让您的Git使用名称
origin
中存储的URL调用他们的Git(位于origin
的Git)。您的Git为他们的Git提供完成整个任务所需的任何新提交和其他对象。然后,如果需要,您的Git将发送提交及其包含的文件。一旦他们具备了所需的一切,您的Git就会向他们发送一个礼貌的请求:如果可以,请创建或更新您的名称
如果他们接受此请求,将创建他们的sample-branch
,以便标识特定的提交。您的Git在此处建议的特定提交与您的名称sample-branch
标识的提交相同。sample-branch
。由于您的Git现在看到其Git已sample-branch
,因此您的Git将创建您的origin/sample-branch
来记住这一点。现在您的Git已
origin/sample-branch
,您的git push -u
将自动调用git branch --set-upstream-to=origin/sample-branch sample-branch
。
如果您出于某种原因希望以旧的两步方式完成此操作,请运行:
git push origin sample-branch:sample-branch
(这里用冒号分隔的两个名称告诉您的Git要告诉他们什么)。然后,当该操作成功时,运行:
git branch --set-upstream-to=origin/sample-branch sample-branch
显然,单个git push -u
命令更短、更容易。
这篇关于既然我已经添加了git Remote Add,为什么还需要在本地分支机构上设置上游?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!