459

git--set-upstream是做什么的?

我试图通过阅读git 手册来理解它,但我不太明白。

4

6 回答 6

569

为避免混淆,
最近的版本git弃用了这个有点模棱两可的--set-upstream选项,转而 使用具有相同语法和行为
的更详细的--set-upstream-to选项。 [参考]


git branch --set-upstream-to <remote-branch>

为当前本地分支设置默认远程分支。

任何未来git pull的命令(当前本地分支已签出)
都将尝试将提交从<remote-branch>当前本地分支引入。


避免显式键入--set-upstream/的一种方法--set-upstream-to是使用其速记标志-u,如下所示:

git push -u origin local-branch

这会自动为任何未来的推/拉尝试设置上游关联。
有关更多详细信息,请查看有关上游分支和跟踪的详细说明

于 2013-08-03T10:48:52.910 回答
61

当您推送到远程并使用--set-upstream标志 git 将您推送到的分支设置为您正在推送的分支的远程跟踪分支。

git fetch添加远程跟踪分支意味着 git 知道您何时或将来要做什么git pullgit push它假设您希望保持本地分支和它正在跟踪的远程分支同步,并采取适当的措施来实现这一点。

git branch --set-upstream-to您可以使用or实现相同的目的git checkout --track有关更多信息,请参阅有关跟踪分支的 git 帮助页面。

于 2013-08-03T10:47:04.730 回答
21

git branch --set-upstream <<origin/branch>>正式不再支持,取而代之的是git branch --set-upstream-to <<origin/branch>>

于 2019-09-02T07:40:06.663 回答
2

--set-upstream用于将本地分支映射到远程分支,这样您就可以执行 git push 或 git pull 并且它会知道从哪个分支推送/拉取

为了添加远程仓库,我使用这些命令

  • 首先,检查您的远程存储库git remote -v
  • 如果您看不到上游,请使用git remote add upstream <URL>
  • 再次检查您的远程存储库git remote -v

一个人可以有多个远程到他们的本地存储库,并且可以使用上面相同的命令添加它。

只需更改上游名称git remote add NAME <URL>

于 2021-10-30T12:06:06.910 回答
1

我假设你的问题是:

做什么git push --set-upstream <repository> <branchname>

如您所见,我假设有问题的 git 命令是git push. 我希望这就是你的意思。为了简化答案,我进一步指定您所在的本地分支 <branchname> 与您推送到的上游存储库 <repository> 上的远程分支具有相同的名称。最后,我假设一个通用的 git 配置。

话虽如此,这就是我的回答

除了git push没有该选项的 a--set-upstream所做的操作之外,此选项还git push 设置了至少两个配置变量

  • 分支.<分支名称>.remote = <存储库>
  • 分支.<分支名称>.merge = /ref/heads/<分支名称>

这就是这个命令所做的一切。它将本地分支的上游信息(即远程存储库和分支)存储在配置变量中。

上游信息存储在本地分支名称下。如果您的本地分支被调用main,则相应的配置变量是branch.main.remotebranch.main.merge。根据上游信息的存储方式,本地分支最多只能有一组上游信息。

您可以使用 查询这些配置变量中的任何一个是否已设置git config --get-regexp ^branch\.。这将输出以“分支”开头的所有变量。

当这些配置变量被使用,例如,git fetch或者git pull如果git push你没有在命令行上明确指定它们来确定本地分支的上游存储库和远程分支时,就会发生魔法。也就是说,当设置了这些配置变量时,您只需发出git push,git 就会(使用这些变量)知道要使用的远程存储库和上游分支。

建议进一步阅读:

但要注意 git 怪癖

如果 <repository> 以 URL 或文件路径的形式给出,请参见以下示例

git push --set-upstream git@gitlab.example.com:namespace/myproject.git master

git push不创建对远程分支头的引用.git/refs/remotes/<repository>

仅当上游存储库已使用

git remote add <repository> <URL>

并且git push --set-upstream已经使用了这个名称,远程跟踪分支的全部功能在所有 git 命令中都可用。

建议进一步阅读:

仅供参考:在 Windows 上使用 git V2.32 测试的所有命令。

于 2021-08-09T15:38:55.503 回答
0

--set-upstream不只是关于git branch -ugit push -u

你也有git fetch --set-upstreamgit pull --set-upstream

如果远程成功获取,则添加上游(跟踪)引用,由无参数git pull和其他命令使用

它将设置:

  • branch.<name>.remote
  • branch.<name>.merge

这将允许git push知道推送到哪里,以及推送到哪个远程分支。

但是: " git fetch --set-upstream" ( man )没有检查是否存在当前分支,导致在分离的 HEAD运行时出现段错误,这已通过 Git 2.35 (Q1 2022) 更正。

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 17baeaf(2021 年 12 月 7 日(由Junio C Hamano 合并 -- --dcaf17c 提交中,2021 年 12 月 22 日)avar
gitster

pull, fetch: 修复 --set-upstream 选项中的段错误

报告人:Clemens Fruhwirth
报告人:Jan Pokorný
签字人:Ævar Arnfjörð Bjarmason

修复了在24bc1a1--set-upstream中添加的选项中的段错误(pull,2019-08-19,Git v2.24.0-rc0 -批次 #2中列出的合并)(pull,fetch: ( man ) option,2019-08-19)添加在 v2.24.0 中。add --set-upstream

自8efb889 (" : segfault fix and validation", 2013-02-23, Git v1.8.3-rc0 --合并在第 2 批中列出以来,添加的代码并没有做我们对 " git branch" ( man )本身所做的相同检查),这反过来又修复了我现在在“ ” man中修复的相同类型的段错误,请参阅6183d82(“ :介绍”,2012-08-20,Git v1.8.0-rc0 -批处理中列出的合并# 5)。branchgit branch --set-upstream-tobranch--set-upstream-to

我在此处添加的警告消息是8efb889git branch中为“ ”添加的错误的合并,并且错误输出本身会发出,即它从名称 中修剪“ ”并显示“ ”,而不是“ ”。install_branch_config()
refs/heads/branch X on remotebranch refs/heads/X on remote

新警告:

could not set upstream of HEAD to 'X' from 'X' 
when it does not point to any branch

我认为简单地在这里更有意义,但在24bc1a1中添加die()的其他检查中,我们发出了一个 warning() 代替。 为了保持一致性,让我们在这里做同样的事情。--set-upstream

由于该补丁破坏了该线程中原始报告的线程,因此在此线程中有一个较早提交的替代方法来解决此问题。 在创作这个版本之前我没有注意到它。 我认为这里的警告信息越详细越好,我们也应该对此行为进行测试。

从最近合并的 7d0daf3 开始,需要“ --no-rebase( man )选项git pullMerge branch 'en/pull-conflicting-options'”,2021-08-30,Git v2.34.0-rc0 --批处理中列出的合并# 2 )。

于 2021-12-24T22:15:40.270 回答