Git如何确定;遥控器我通常从;决定push.default=simple的行为?

Git如何确定;遥控器我通常从;决定push.default=simple的行为?,git,configuration,push,default,Git,Configuration,Push,Default,从Git 2.0版开始,如果未在用户配置中指定,push.defaultconfig选项的默认值为simple 根据文件,这意味着: 在集中式工作流中,如果上游分支机构的名称与上游分支机构的名称不同,则可以像上游分支机构一样使用附加的安全机制拒绝推送 本地的 当按下一个与您通常使用的遥控器不同的遥控器时,将以当前状态工作。这是最安全的选择,适用于 初学者 在编写培训材料时,我在使用“git push”edge案例时,发现了配置选项的一个令人惊讶的分支: 如果您位于未配置上游的分支上,并且在有两个

从Git 2.0版开始,如果未在用户配置中指定,
push.default
config选项的默认值为
simple

根据文件,这意味着:

在集中式工作流中,如果上游分支机构的名称与上游分支机构的名称不同,则可以像上游分支机构一样使用附加的安全机制拒绝推送 本地的

当按下一个与您通常使用的遥控器不同的遥控器时,将以当前状态工作。这是最安全的选择,适用于 初学者

在编写培训材料时,我在使用“git push”edge案例时,发现了配置选项的一个令人惊讶的分支:

如果您位于未配置上游的分支上,并且在有两个遥控器的情况下运行“git push my remote”,在某些情况下会出现错误:

fatal: The current branch my-branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream my-remote my-branch
在其他情况下,推送将成功,并将在远程上创建新分支,远程跟踪分支也将随之创建(但不将远程分支配置为上游)

经过对不一致性的极度混淆和对文档的深入研究,我终于意识到,
push.default的
upstream
config选项(它的
simple
有时的行为类似)只会推送到上游分支,如果没有配置上游,则会失败,而无论上游是否配置,
current
config选项(其
simple
有时也会起作用)都将起作用

因此,问题的关键在于,当选择了
simple
选项(或留空)时,Git是作为
当前
还是作为
上游
进行特定推送。文档中只说,当推到一个与您通常从中拉出的遥控器不同的遥控器时,它作为当前的遥控器工作。那么,它是如何确定的呢?

我已经检查了一些明显的事情,比如我有哪些远程跟踪分支,但是我的两个测试报告之间的结果仍然不一致。我甚至尝试添加一个新的空回购协议作为我的回购协议的遥控器,它会给我错误消息,并尝试推送到那个位置,但我得到了相同的错误。不幸的是,我今天一直在玩这些测试回购的获取和推送,以至于很难确定区别是什么

但这个问题不是关于我的具体回购协议,也不是关于它们行为不一致的原因;这只是对这个问题的答案进行逆向工程的一种尝试,文档中似乎没有给出明确的答案

如果您能回答有关文档的问题,我们将不胜感激(我不确定是否能在那里找到答案);参考Git源代码的答案也很好,但我不能完全流利地阅读C,所以解释一下可能会有所帮助。:)

您可以使用

特别是:

test\u expect\u success'推送到现有分支,没有配置上游''
test_config branch.master.remote repo1&&
git签出主机&&
测试推送故障简单&&
上游测试推送故障
'
测试\u期望\u成功“推送到现有分支,上游配置相同名称”
test_config branch.master.remote repo1&&
测试配置branch.master.merge refs/heads/master&&
git签出主机&&
第六次测试&&
测试推送成功上游主机&&
第七次测试&&
测试推送成功简易主机
'
测试\u期望\u成功“推送到现有分支,上游配置了不同的名称”
test_config branch.master.remote repo1&&
test_config branch.master.merge refs/heads/other name&&
git签出主机&&
第八次测试&&
测试推送成功上游其他名称&&
测试九&&
测试推送故障简单&&
git--git dir=repo1 log-1--format=“%h%s”“其他名称”>需要其他名称&&
测试推送成功当前主机&&
git--git dir=repo1 log-1--format=“%h%s”其他名称“>实际的其他名称&&
测试\u cmp预期其他名称实际其他名称
'
如果指定了上游分支(
git config branch.master.merge refs/heads/master
),则简单或上游推送策略将起作用。
前提是分支名称与上游名称匹配

上游
-将当前分支推回到其更改通常集成到当前分支的分支(称为
@{上游}
)。 只有当您推送到通常从中提取的同一存储库(即中心工作流)时,此模式才有意义

simple
-在集中式工作流中,如果上游分支机构的名称与本地分支机构的名称不同,则可以像上游分支机构一样工作,增加安全性,拒绝推送


如果您认为边缘情况不在这些测试范围内,那么新的(Git 2.27+)可以派上用场。

我们通常从中提取的远程设备是使用配置变量
branch..remote

如果未配置远程,或者您不在任何分支上,则默认为
origin

示例:
假设我们有两个遥控器origin和origin2。
对于我们的分支主机,我们设置为remote
origin2
git config branch.master.remote origin2

假设
push.default
设置为
simple

还假设没有为
主机
配置上游
当我们在分支
master
上时,让我们运行
gitpush

出现错误,因为我们处于
simple
模式,推送被阻止
但是,如果我们运行
git push origin
,它将作为当前的工作方式,因为我们正在推送到一个与我们通常从中拉出的遥控器不同的遥控器,即