Git 分支在推送时自动重命名
Posted
技术标签:
【中文标题】Git 分支在推送时自动重命名【英文标题】:Git branch automatically renames on push 【发布时间】:2016-02-10 10:06:42 【问题描述】:我有一个奇怪的问题。我正在使用 Github,并试图重命名一个分支。我已经在otherquestions 中阅读了有关重命名分支的内容,并且我正在按照信中的说明进行操作,但遇到了一些错误。
首先,情况:我有一个名为 Framework 的分支,我现在意识到应该更好地命名为“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】:请原谅这里的重述,但是:你正在运行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
。
【讨论】:
我不会假装理解 Git 的大部分复杂性,但我很高兴有人知道。谢谢!但是当您说“删除上游设置”时,那是什么意思? 然后当我再次尝试发布时,它会重新创建框架分支。这是否与仍然缺少映射的事实有关?如何将 platform-control-dev local 设置为与远程相同? 任何给定分支的上游设置(由于历史原因)存储在配置中的两个部分(git config -e
或cat .git/config
以查看它)。要删除它,您可以运行两个git config
步骤,或使用新的git branch --unset-upstream
命令。或者,您将上游设置为新名称,再次使用两个git config
命令或新的git branch --set-upstream-to <upstream>
命令。这些可以使用一些格式,我会编辑它们。
完美!谢谢!不过,其他人似乎过得如此轻松,这似乎仍然很奇怪。呵呵。以上是关于Git 分支在推送时自动重命名的主要内容,如果未能解决你的问题,请参考以下文章