我有一个奇怪的问题。我正在使用Github,并尝试重命名一个分支。我已经阅读了有关在other questions中重命名分支的说明,并且我按照信函的说明操作,遇到了一些错误。
首先,情况:我有一个名为Framework的分支,我现在意识到应该更好地命名为#34; Platform-Control-Dev"因为它的内容从接口转移到实现。在本地重命名后,我做的第一件事就是我见过的最简单的命令:git push origin :Framework Platform-Control-Dev
。这导致了一个关于" dst ref refs / heads / Framework从多个src"收到的错误。然后我决定一步一步走; git push origin :Framework
已成功删除远程分支。但是,当我尝试将重命名的本地分支推回时,将其重命名为Framework 。
* [new branch] Platform-Control-Dev -> Framework
我所看到的关于这个问题的答案都没有解决这个问题,而且我在我的智慧'最终试图找出它为什么这样做。如果有人知道原因,以及如何解决它,我们将不胜感激。
答案 0 :(得分:4)
原谅显而易见的重述,但是:你正在运行git push origin refspec
。
问题的关键在于push
如何处理缺少冒号refspec
的 :
,即只是源指定符。
通常在推送分支时,您将推送到上游的相同分支名称,除非您已经设置了命名上游。在这种情况下,您的git会发现上游已重新映射:您的本地分支Platform-Control-Dev
对应origin
的{{1}}。所以你的git在向上方向重新映射,就像它在向下(fetch-and-then-(merge | rebase))方向一样。
您可以删除上游设置(清除映射),或者只是推送到两部分refspec:
Framework
(顺便说一下,我养成了使用git push origin Platform-Control-Dev:Platform-Control-Dev
的习惯,因为我经常在一个跟踪我自己的“主”本地分支的本地分支中工作,而不是直接从{{1}复制的东西。但问题是:这有其自身的危害:我每次都必须小心地命名正确的git push <remote> HEAD:<branch>
。:-))
(顺便说一下,这就是你得到双源(remote
)错误的原因:你的git决定将上游<branch>
引用设置为无 - 删除它 - 和来自receives from more than one src
的SHA-1。)
编辑:正如您所发现的那样,只要旧的上游设置到位,您的git就会继续在服务器上重新创建Framework
分支名称。 (此外,你的git不会自动从新上游获取更改,甚至可能更糟。)
要查看上游设置,请查看您的Platform-Control-Dev
文件,您将看到(以及其中的所有其他内容):
Framework
.git/config
部分是正确的,但[branch "Platform-Control-Dev"]
remote = origin
merge = refs/heads/Framework
部分是指服务器上的旧分支名称,而旧分支名称来自此处。
你可以手动修复它(这是我倾向于做的,因为当我第一次开始做这个东西时,下面的“好”选项不在git中),或者使用以下之一。请注意,origin
和merge
适用于当前分支(默认情况下),因此您应该检出--set-upstream-to
分支。
新的简单方法:
--unset-upstream
(只要您的git不太古老而无法使用Platform-Control-Dev
),就可以使用。
老派方法:
$ git branch --set-upstream-to origin/Platform-Control-Dev
(或编辑--set-upstream-to
,这是我通常仍在做的事情!)
“完全删除上游设置”方法:
$ git config branch.Platform-Control-Dev.merge refs/heads/Platform-Control-Dev
在此之后,您可以使用常规.git/config
进行设置。由于此时没有设置上游,因此push不会(不能)重新映射回旧名称。相反,它将创建或更新新名称,然后使用新名称为您执行$ git branch --unset-upstream
。