git - 为什么我已经添加了 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
关于后续命令。
解决方案
对于 TL;DR 版本,请参阅VonC 的回答。
git remote add
添加一个遥控器。遥控器可以有您喜欢的任何名称,但按照惯例,origin
它是第一个,upstream
通常是第二个。但通常,如果您添加了第二个遥控器,它将具有不同的URL,而不是相同的 URL。如果您与多个不同的 Git 存储库通信,每个都位于不同的 URL,那么您只需要一个以上的遥控器。
令人困惑的是,远程命名upstream
(假设你有一个)不是上游,它只是一个远程。
术语upstream,当应用于分支名称时,指的是内部的两部分设置(如VonC 所说)。每个分支名称,例如master
or feature
,可以有一个上游,也可以没有上游。通常,上游master
是origin/master
,上游feature
是origin/feature
。如果您确实有多个遥控器,并调用了第二个遥控器,则upstream
可以将上游设置branchX
为upstream/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-branch
origin/sample-branch
origin
origin
sample-branch
origin/sample-branch
你最终需要为此做点什么。无需立即执行此操作!你可以随时做。但最终,你确实需要这样做。涉及两个步骤:
你必须得到另一个 Git,一个 over on
origin
,才能创建一个名为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(位于 的 Git)origin
。您的 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 什么)。然后,当成功后,运行:
git branch --set-upstream-to=origin/sample-branch sample-branch
显然,单个git push -u
命令更短更容易。
推荐阅读
- php - While 循环不会停止遍历数组
- django - 将 Django 与 html 编辑器一起使用,对文本进行处理和解码
- javascript - Electron 在生产中将应用程序路径添加到我的 src 路径
- c++ - 如何将递归函数的线程与子线程同步
- javascript - 如何使用 ajax 获得 Google Closure 响应
- laravel - VueJS + Laravel Passport CSRF Token 已过期如何刷新
- keras - Value_Error:批量大小不是合法参数
- php - 如果数据透视表中没有记录,Laravel Eloquent 多对多获取最新日期和默认值
- google-cloud-platform - GCP Pub/Sub 可以用于 webhook 吗?不,因为域验证?
- sqlalchemy - 如果发生错误,如何回滚所有迁移?