首页 > 解决方案 > 为什么我已经添加了 git remote add 后需要在本地分支上设置上游?

问题描述

我有一个关于 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)

所以我创建了一个取自 master 的新分支

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 

关于后续命令。

标签: gitgitlab

解决方案


对于 TL;DR 版本,请参阅VonC 的回答

git remote add添加一个遥控器。遥控器可以有您喜欢的任何名称,但按照惯例,origin它是第一个,upstream通常是第二个。但通常,如果您添加了第二个遥控器,它将具有不同的URL,而不是相同的 URL。如果您与多个不同的 Git 存储库通信,每个都位于不同的 URL,那么您只需要一个以上的遥控器。

令人困惑的是,远程命名upstream(假设你有一个)不是上游,它只是一个远程。

术语upstream,当应用于分支名称时,指的是内部的两部分设置(如VonC 所说)。每个分支名称,例如masteror feature,可以有一个上游,也可以没有上游。通常,上游masterorigin/master,上游featureorigin/feature。如果您确实有多个遥控器,并调用了第二个遥控器,则upstream可以将上游设置branchXupstream/branchX

所以:一个分支的上游是一些其他的名字,通常是一个以remote的名字开头的名字。Git 使用这个设置来记住“那是我获取/拉取的地方”和“那是我推送到的地方”。但是,这个名称必须实际存在,这才是真正令人困惑的地方。

所以我创建了一个取自 master 的新分支

git checkout -b sample-branch master
Switched to a new branch 'sample-branch'

从技术上讲,这会在您自己的 Git 存储库中创建一个新的分支名称,名为sample-branch. 此新分支名称选择提交哈希 ID 与现有名称master(也是分支名称)选择的提交哈希 ID 相同。

当你使用这种git checkout命令时,你的 Git 会将新分支的上游设置为另一个分支名称,例如. 但你可能没有. 这个名字只有在 Git over at -at the URL store in the remote named ,即 - 有一个名为 的分支,并且你的 Git 已经看到并复制它时才会存在。由于你没有在这里使用——如果你这样做了,它无论如何都会失败——你的 Git没有为新分支设置上游。origin/sample-branchorigin/sample-branchoriginoriginsample-branchorigin/sample-branch

你最终需要为此做点什么。无需立即执行此操作!你可以随时做。但最终,你确实需要这样做。涉及两个步骤:

  1. 你必须得到另一个 Git,一个 over on origin,才能创建一个名为sample-branch. 当您让 Git 创建它的 sample-branch时,您的Git 现在可以将其复制到您的origin/sample-branch,以便您的origin/sample-branch存在。

  2. 一旦你origin/sample-branch存在,你需要让你的Git 设置origin/sample-branchsample-branch.

可以使用两个单独的 Git 命令来完成这两个步骤的过程,而在过去,您必须这样做。但是,对于现代 Git 版本,一个命令就足够了。那一个命令是git push -u origin sample-branch

这是做什么的:

  1. 让您的 Gitorigin使用名称中存储的 URL 调用他们的 Git(位于 的 Git)origin

    您的 Git 为他们的 Git 提供完成整个任务所需的任何新提交和其他对象。然后,如果需要,您的 Git 将发送提交及其包含的文件。一旦他们拥有所需的一切,您的 Git 就会向他们发送一个礼貌的请求:如果可以,请创建或更新您的名称sample-branch,以便它识别特定的提交。 您的 Git 在此处推荐的特定提交与您的姓名sample-branch标识的提交相同。

    如果他们接受此请求,则会创建他们的sample-branch. 由于您的 Git 现在看到他们的 Git 具有sample-branch,因此您的 Git 会创建您origin/sample-branch来记住这一点。

  2. 现在你的 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 什么)。然后,当成功后,运行:

git branch --set-upstream-to=origin/sample-branch sample-branch

显然,单个git push -u命令更短更容易。


推荐阅读