我有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.push
或remote.master1.push
。
让我们分为两个部分。
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 branch
或git checkout -b
及其上游
git branch
和git checkout
都可以创建新的分支名称。分支名称可以设置上游设置,也可以不设置。
因此,当
git branch
或git checkout
创建新的分支名称时,它们具有设置上游的选项
。它们的实际行为可以使用branch.autoSetupMerge
和branch.autoSetupRebase
进行配置。他们的default
行为是这样的:如果不提供起始提交,则在创建新分支时将
HEAD
用作起始提交,并且不要设置上游。- 如果您
- do
提供开始提交,请检查提供的参数的形式:如果它具有远程跟踪名称的形式(这意味着该远程名称和该远程名称上显示的分支名称,请设置上游名称。)>
- 否则,请勿设置上游。
由于 git branch master1
不提供起始提交,因此将使用HEAD
解析为的哈希ID创建新名称,并且它没有上游。因此,您的git branch -vv
没有显示上游设置。设置使事情变得复杂
所有不同设置(
push.default
,remote.<name>.push
和其他设置)之间所有可能的交互的确切详细信息可能会使所有这些混乱。我之所以这样说,主要是因为您提到您没有设置任何一个。如果这样做,上述某些或全部可能会失效。 Git文档涵盖了一些但并非所有可能的组合。在说某种组合应该以某种特定方式表现的情况下,它应该以这种方式表现。否则,它可能以Git编码人员认为对其方便的任何方式表现。配置选项时要小心:某些组合可能从未经过测试。