在执行 'git push' 命令时,'--set-upstream' 参数的作用是什么?

552

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

我尝试通过阅读git手册来理解它,但我没有完全理解。


2
问题没有说明完整的git命令。只能推断出它是关于git push --set-upstream命令的。 - Daniel K.
6个回答

662
为了避免混淆,最近版本的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

这将自动设置上游关联,以便于未来的推送/拉取尝试。
如需更多详细信息,请查看有关上游分支和跟踪的详细说明


6
在这个命令 git push -u origin local-branch 中,origin 代表仓库的名称。除非您有多个远程仓库,否则通常都是使用 origin。在某些情况下,您可能会使用不同的名称替换 origin,例如如果您有另一个远程仓库,您可以使用该仓库的名称。但通常情况下,origin 是默认选项并且是最常用的。 - John Henckel
14
@JohnHenckel origin 指的是用于克隆的远程 git 存储库。可以存在多个远程 git 存储库。在这种情况下,可以将 origin 替换为所需远程存储库的正确名称以进行引用。 - TheCodeArtist
运行 git remote -v 命令查找您的远程仓库,通常默认的是 origin - xploreraj

74

当你向远程仓库推送并使用 --set-upstream 标记时,git 会将你要推送的分支设置为你正在推送的分支的远程跟踪分支。

添加远程跟踪分支意味着 git 知道了你未来在执行 git fetchgit pull 或者 git push 时想要做什么。它会自动假设你想把本地分支与跟踪的远程分支同步,并采取适当的措施来实现这一点。

你也可以通过 git branch --set-upstream-to 或者 git checkout --track 来实现相同的功能。更多信息请参考 git 帮助页面上关于跟踪分支的部分。


当我使用“-t”进行检出时,它只会设置上游以供拉取,而不是推送。 - Jim
这个答案假设有一个分支正在被推送到:D。 - T.Woody

29

git branch --set-upstream <<origin/branch>> 已经不再官方支持,现在已被 git branch --set-upstream-to <<origin/branch>> 替代。


9

--set-upstream 的作用是将本地分支映射到远程分支,这样你只需要使用 git pushgit pull 命令,Git 就会知道从哪个分支进行推送或拉取。

以下是添加远程库的命令:

  • 首先,使用 git remote -v 命令检查远程库。
  • 如果看不到 upstream,则使用 git remote add upstream <URL> 命令添加。
  • 再次使用 git remote -v 命令检查远程库。

通过以上相同的命令,可以将多个远程库关联到一个本地仓库。

只需将 upstream 改为其他名称即可: git remote add NAME <URL>


4
我假设您的问题是:

git push --set-upstream <repository> <branchname>命令是做什么用的?

如您所见,我假设这个问题中的git命令是git push。我希望这就是您的意思。为了简化回答,我进一步指定您所在的本地分支<branchname>与您要推送到的上游仓库<repository>上的远程分支具有相同的名称。最后,我假设使用了常见的git配置。
说完这些,这是我的回答
除了不带选项--set-upstreamgit push所执行的操作外,该选项至少会使git push设置两个配置变量
  • branch.<branchname>.remote = <repository>
  • branch.<branchname>.merge = /ref/heads/<branchname>

这就是该命令所做的全部内容。它将本地分支的上游信息(即远程仓库和分支)存储在配置变量中。

上游信息存储在本地分支名称下。如果您的本地分支名为main,则相应的配置变量为branch.main.remotebranch.main.merge。根据上游信息的存储方式,本地分支最多只能有一个上游信息集。
您可以使用git config --get-regexp ^branch\.查询是否设置了这些配置变量。这将输出以"branch."开头的任何变量。
当这些配置变量被用于例如git fetchgit pullgit push时,它们将自动查找本地分支的上游存储库和远程分支,如果您没有在命令行上显式指定它们。也就是说,当这些配置变量被设置时,您只需发出git push命令,Git就会知道(使用这些变量)要使用哪个远程存储库和上游分支。
建议进一步阅读: 但要注意Git的怪癖:
如果使用URL或文件路径作为,请参考例如this example
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。

1

--set-upstream 不仅仅适用于 git branch -u 或者 git push -u

你还可以使用 git fetch --set-upstreamgit pull --set-upstream

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

它将设置:

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

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

但是:"git fetch --set-upstream"(man)没有检查是否有当前分支,在一个detached HEAD上运行时会导致段错误(segfault),在Git 2.35(2022年第一季度)中已得到纠正。

请查看 提交记录 17baeaf(2021年12月7日),作者为Ævar Arnfjörð Bjarmason (avar)
(于2021年12月22日由Junio C Hamano -- gitster --合并至提交记录 dcaf17c

拉取,获取:修复--set-upstream选项中的段错误

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

修复 24bc1a1 中添加的 --set-upstream 选项中的段错误(拉取,2019年8月19日,Git v2.24.0-rc0 -- merge 列在 batch #2 中)(拉取,获取:addman--set-upstream 选项 ,2019年8月19日)添加在v2.24.0中。

由于 8efb889(“分支:segfault 修复和验证”,2013年2月23日,Git v1.8.3-rc0 -- merge 列在 batch #2 中)修复了我正在修复的 "git branch --set-upstream-to"man 中相同类型的段错误,因此在那里添加的代码与我们为 "git branch"man 自身进行的检查不同。参见 6183d82("branch:introduce --set-upstream-to",2012年8月20日,Git v1.8.0-rc0 -- merge 列在 batch #5 中)。

我在此添加的警告消息是 "git branch" 中添加的错误和 install_branch_config() 本身发出的错误输出的综合,即:
它从名称中修剪了“refs/heads/”,并说“在远程上的分支X”,而不是“在远程上的refs/heads/X 分支”。

新警告:

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

我认为在这里简单地die()更有意义,但在24bc1a1中添加了其他--set-upstream检查时,我们改为发出一个warning()。
暂时保持一致性,让我们在这里也这样做。先前提交的另一种修复方式在此线程中,由于该补丁破坏了原始报告中的线程,因此需要--no-rebase选项才能 "git pull"(man) (最近合并的7d0daf3需要-“Merge branch'en/pull-conflicting-options'”,2021年8月30日,Git v2.34.0-rc0 -- merge listed in batch #2)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接