【问题标题】:What does '--set-upstream' do?'--set-upstream' 有什么作用?
【发布时间】:2013-08-04 14:42:12
【问题描述】:

git --set-upstream 做什么?

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

【问题讨论】:

  • 该问题没有说明完整的 git 命令。只能推断是和git push --set-upstream这个命令有关。

标签: git push git-push git-remote upstream-branch


【解决方案1】:

--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) 没有检查当前分支是否存在,导致在 segfault 上运行时 segfault strong>detached HEAD,已在 Git 2.35(2022 年第一季度)中更正。

参见Ævar Arnfjörð Bjarmason (avar)commit 17baeaf(2021 年 12 月 7 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit dcaf17c,2021 年 12 月 22 日)

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

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

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

由于8efb889 ("branch: segfault fix and validation", 2013-02-23,Git v1.8.3-rc0 -- mergebatch #2 中列出),这反过来又修复了我现在在“git branch --set-upstream-to(@987654344 @),见6183d82(“branch:介绍--set-upstream-to”,2012-08-20,Git v1.8.0-rc0 -- merge列在batch #5中)。

我在这里添加的警告消息是8efb889 中为“git branch”添加的错误的合并,错误输出install_branch_config() 本身发出,即
它从名称中删除“refs/heads/”并显示“branch X on remote”,而不是“branch refs/heads/X on remote”。

新警告:

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

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

之前提交了一种修复此in this thread 的替代方法,因为该补丁破坏了this thread 原始报告的线程。
在创作这个版本之前我没有注意到它。
我认为这里的警告信息越详细越好,我们也应该对此行为进行测试。

从最近合并的7d0daf3 ("Merge branch 'en/pull-conflicting-options'" , 2021-08-30, Git v2.34.0-rc0 -- merge 列于batch #2)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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


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

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

      任何未来的git pull 命令(当前本地分支已签出),
      将尝试将来自 &lt;remote-branch&gt; 的提交引入当前本地分支。


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

      git push -u origin local-branch
      

      这会自动为将来的任何推/拉尝试设置上游关联。
      欲了解更多详情,请查看此detailed explanation about upstream branches and tracking

      【讨论】:

      • --set-upstream 标志已弃用并将被删除。考虑使用 --track 或 --set-upstream-to
      • 在这个命令中git push -u origin local-branchorigin代表什么?在任何情况下我会在-u 之后输入除origin 以外的任何内容?
      • @JohnHenckel origin 指的是用于克隆的远程 git 存储库。可以有multiple remote git repositories。在这种情况下,origin 可以替换为希望引用的所需遥控器的正确名称。
      • 做一个git remote -v来找到你的遥控器,默认的通常是origin
      【解决方案4】:

      我假设您的问题是:

      git push --set-upstream &lt;repository&gt; &lt;branchname&gt; 是做什么的?

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

      话虽如此,这是我的答案

      除了没有--set-upstream 选项的git push 所做的操作之外,this option 使git push set 至少两个configuration variables

      • branch..remote =
      • branch..merge = /ref/heads/

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

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

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

      如果您没有在命令行。也就是说,当这些配置变量设置好后,你只需发出git push,git 就会(使用这些变量)知道要使用的远程存储库和上游分支。

      建议进一步阅读:

      但要注意 git 怪癖

      如果 以 URL 或文件路径的形式给出,请参见例如 this example:

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

      git push 不会在.git/refs/remotes/&lt;repository&gt; 中创建对远程分支头的引用

      仅当上游存储库已被命名时使用

      git remote add <repository> <URL>
      

      git push --set-upstream 已与此名称一起使用,远程跟踪分支的全部功能可在所有 git 命令中使用。

      建议进一步阅读:

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

      【讨论】:

      • 我喜欢这个答案,很详细。谢谢@Daniel K
      【解决方案5】:

      git branch --set-upstream &lt;&lt;origin/branch&gt;&gt; 正式不再支持,由git branch --set-upstream-to &lt;&lt;origin/branch&gt;&gt; 取代

      【讨论】:

        【解决方案6】:

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

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

        您可以使用git branch --set-upstream-togit checkout --track 实现相同的目标。有关更多信息,请参阅tracking branches 上的 git 帮助页面。

        【讨论】:

        • 当我使用 -t 结帐时,它确实将上游设置为推送,仅用于拉取。
        • 这个答案是假设有一个分支被推送到:D
        猜你喜欢
        • 1970-01-01
        • 2011-12-06
        • 2016-07-16
        • 1970-01-01
        • 2014-11-23
        • 2018-02-07
        • 1970-01-01
        • 2012-08-06
        • 2012-03-04
        相关资源
        最近更新 更多