请原谅这里的重述,但是:你正在运行git push origin <em>refspec</em>。
问题的关键在于push 如何处理缺少冒号: 的refspec,也就是说,它只是一个源说明符。
通常在推送分支时,您会推送到相同的分支名称上游,除非您已经设置了命名上游。在这种情况下,您的 git 发现上游已重新映射:您的本地分支 Platform-Control-Dev 对应于 origin 的 Framework。所以你的 git 在 upwards 方向上重新映射,就像它在向下 (fetch-and-then-(merge|rebase)) 方向上所做的那样。
您可以删除上游设置(清除映射),或简单地推送到两部分 refspec:
git push origin Platform-Control-Dev:Platform-Control-Dev
(顺便说一句,我已经养成了使用git push <remote> HEAD:<branch> 的习惯,因为我经常在一个跟踪我自己的“主要”本地分支的本地分支中工作,而不是直接从相关remote 复制的东西。但是,这有其自身的危险:我必须每次都小心命名正确的<branch>。:-))
(另外,顺便说一句,这就是为什么你得到双源(receives from more than one src)错误:你的 git 决定将上游 Framework ref 设置为空——删除它——以及 SHA-1你的Platform-Control-Dev。)
编辑:正如您所发现的,只要旧的上游设置到位,您的 git 就会继续在服务器上重新创建 Framework 分支名称。 (而且你的 git 不会自动从新的上游获取更改,这可能会更糟。)
要查看上游设置,请查看您的 .git/config 文件,您会看到(以及其中的所有其他内容):
[branch "Platform-Control-Dev"]
remote = origin
merge = refs/heads/Framework
origin 部分是正确的,但 merge 部分指的是服务器上的旧分支名称,而这就是旧分支名称的来源。
您可以手动修复此问题(这是我倾向于做的,因为当我第一次开始做这些事情时,下面的“不错”选项不在 git 中),或者使用以下选项之一。请注意,--set-upstream-to 和 --unset-upstream 在当前分支上工作(默认情况下),因此您应该签出您的 Platform-Control-Dev 分支。
-
新的、简单的方法:
$ git branch --set-upstream-to origin/Platform-Control-Dev
(只要你的 git 不是太古老而不能拥有--set-upstream-to,这是可以使用的)。
-
老派的方法:
$ git config branch.Platform-Control-Dev.merge refs/heads/Platform-Control-Dev
(或编辑.git/config,我通常仍然这样做!)
-
“完全删除上游设置”方法:
$ git branch --unset-upstream
在此之后,您可以使用常规的git push -u 来设置它。由于此时没有设置上游,push 不会(不能)重新映射回旧名称。相反,它将创建或更新新名称,然后使用新名称为您创建git branch --set-upstream-to。