git push不要求设置上游,即使没有设置上游

问题描述 投票:0回答:1

我有master分支,并且设置了以下配置。

branch.master.remote=github
branch.master.merge=refs/heads/master
push.default=simple

现在我想测试push.default的行为。我做了

git branch master1 // This created a new branch on same commit as master
git checkout master1
git push github

现在,由于我的本地分支名称为master1并且它是新分支,因此它没有任何上游设置。为什么git push github没有向我显示使用--set-upstream标志的错误消息?同样,它在远程仓库上成功创建了master1分支。另外,在运行git branch -vv

后,我看不到任何远程跟踪分支
  master  42f18f8 [github/master] Some message
  master1 42f18f8 Some message

但是,如果我刚在git push分支上时完成了master1,那么它会要求--set-upstream

而且,我没有设置remote.github.pushremote.master1.push

git
1个回答
0
投票

让我们分为两个部分。

[git push和上游

[First:git push,不带其他参数,将(通常-取决于设置,我将不在这里介绍),它会查看current分支的上游设置。

如果当前分支上没有上游,则会得到:

fatal: The current branch <branch> has no upstream branch.

((随后使用可配置建议使用git push --set-upstream;如果不进行配置,则不会获得建议)。

[如果有上游,您会收到该错误。这就是全部。如果有上游设置,则git push不会告诉您设置一个。如果不是,它将给您一个错误,并且(除非您已配置建议,否则)建议您设置一个。第二,git push

带有附加参数

的行为有所不同。但是您没有运行:
git push github

您实际上跑了:

git push github master1

(检查命令历史记录。)如果您提供一个

refspec

参数(此四字git push命令执行此参数),则refspec提供分支名称-既是本地使用的,也是一个您的Git要求设置他们的Git。不需要当前分支,也不需要任何分支的任何上游设置。[git branchgit checkout -b及其上游

git branchgit checkout都可以创建新的分支名称。

分支名称可以设置上游设置,也可以不设置。

因此,当git branchgit checkout创建新的分支名称时,它们具有设置上游的

选项

它们的实际行为可以使用branch.autoSetupMergebranch.autoSetupRebase进行配置。他们的

default

行为是这样的:
    如果不提供起始提交,则在创建新分支时将HEAD用作起始提交,并且不要设置上游。
  • 如果您
  • do
  • 提供开始提交,请检查提供的参数的形式:
      如果它具有远程跟踪名称的形式(这意味着该远程名称和该远程名称上显示的分支名称,请设置上游名称。)>
    • 否则,请勿设置上游。
  • 由于git branch master1不提供起始提交,因此将使用HEAD解析为的哈希ID创建新名称,并且它没有上游。因此,您的git branch -vv没有显示上游设置。
  • 设置使事情变得复杂

    所有不同设置(push.defaultremote.<name>.push和其他设置)之间所有可能的交互的确切详细信息可能会使所有这些混乱。我之所以这样说,主要是因为您提到您没有设置任何一个。如果这样做,上述某些或全部可能会失效。 Git文档涵盖了一些但并非所有可能的组合。

    在说某种组合应该以某种特定方式表现的情况下,它应该以这种方式表现。否则,它可能以Git编码人员认为对其方便的任何方式表现。配置选项时要小心:某些组合可能从未经过测试。

    © www.soinside.com 2019 - 2024. All rights reserved.