'——set-upstream'做什么?

git --set-upstream做什么?

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

527879 次浏览

当你使用--set-upstream标记推送到一个远程对象时,git将你要推送的分支设置为你要推送的分支的远程跟踪分支。

添加远程跟踪分支意味着当你将来git fetchgit pullgit push时,git知道你想做什么。它假设您希望保持本地分支和它正在跟踪的远程分支同步,并执行适当的操作来实现这一目标。

你可以用git branch --set-upstream-togit checkout --track来实现同样的事情。有关更多信息,请参阅跟踪分支上的git帮助页。

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

自动设置未来任何推/拉尝试的上游关联。
有关更多详细信息,签出上游分支及跟踪详细说明 ..

.

git branch --set-upstream <<origin/branch>>不再被官方支持,被git branch --set-upstream-to <<origin/branch>>取代

我假设你的问题是:

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

如你所见,我假设git命令是git push。我希望你是这个意思。为了简化答案,我进一步指定本地分支<与上游存储库上的远程分支具有相同的名称<你正在努力实现的目标。最后,我假设一个常见的git配置。

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

除了没有--set-upstream选项的git push所做的操作外,这个选项使git push 至少有两个配置变量:

  • 分支。你们;branchname>。Remote = <
  • 分支。你们;branchname>。Merge = /ref/heads/<

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

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

您可以使用git config --get-regexp ^branch\.查询是否设置了这些配置变量。这将输出任何以"branch."开头的变量;

当这些配置变量被诸如git fetchgit pullgit push使用时,如果你没有在命令行上显式地指定它们,它们就会为本地分支找出上游存储库和远程分支。也就是说,当这些配置变量设置好后,你可以发出git push, git就会知道(使用这些变量)要使用的远程存储库和上游分支。

建议进一步阅读:

但是要注意git的怪癖:

如果& lt; 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测试的。

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

为了添加远程回购,我使用这些命令

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

通过使用上面相同的命令,可以有多个远程到本地存储库。

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

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

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

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

它将设置:

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

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

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

参见提交17 baeaf (07 Dec 2021) by Ævar Arnfjörð Bjarmason (avar)
(由Junio C Hamano—gitster提交dcaf17c中合并,22 Dec 2021)

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

< p > 报道:Clemens Fruhwirth
报告作者:Jan Pokorný
署名:Ævar Arnfjörð Bjarmason

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

这里添加的代码没有做与8 efb889以来我们对“__abc5”(man)本身所做的相同的检查(“branch:段错误修复和验证”,2013-02-23,Git v1.8.3-rc0—合并列在批# 2中),这又修复了我现在正在“__abc10”branch1中修复的相同类型的段错误,参见branch2(“branch:引入__abc4”,2012-08-20,Git v1.8.0-rc0—branch3列在branch4中)。

我在这里添加的警告消息是为“;git branch"8 efb889中的错误输出install_branch_config()本身发出,即
它修剪&;refs/heads/"

.

.

新警告:

could not set upstream of HEAD to 'X' from 'X'
when it does not point to any branch
我认为在这里简单地die()会更有意义,但在24 bc1a1中添加的其他--set-upstream检查中,我们发出了一个警告()。
为了保持一致性,让我们在这里做同样的事情 有一个早期提交的替代方法来修复这个在这篇文章中,由于补丁破坏线程与原始报告在这个线程
在创作这个版本之前,我没有注意到它。
我认为这里更详细的警告信息更好,我们还应该对这种行为进行测试

在最近合并的7 d0daf3(“合并分支”en/pull-conflict -options”", 2021-08-30, Git v2.34.0-rc0—合并列在批# 2中)中,需要“git pull"(man)”的--no-rebase选项。