Git分支在推送时自动重命名

时间:2015-11-09 17:21:05

标签: git github

我有一个奇怪的问题。我正在使用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

我所看到的关于这个问题的答案都没有解决这个问题,而且我在我的智慧'最终试图找出它为什么这样做。如果有人知道原因,以及如何解决它,我们将不胜感激。

1 个答案:

答案 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中),或者使用以下之一。请注意,originmerge适用于当前分支(默认情况下),因此您应该检出--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