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 对应于 originFramework。所以你的 git 在 upwards 方向上重新映射,就像它在向下 (fetch-and-then-(merge|rebase)) 方向上所做的那样。

您可以删除上游设置(清除映射),或简单地推送到两部分 refspec:

git push origin Platform-Control-Dev:Platform-Control-Dev

(顺便说一句,我已经养成了使用git push &lt;remote&gt; HEAD:&lt;branch&gt; 的习惯,因为我经常在一个跟踪我自己的“主要”本地分支的本地分支中工作,而不是直接从相关remote 复制的东西。但是,这有其自身的危险:我必须每次都小心命名正确的&lt;branch&gt;。:-))

(另外,顺便说一句,这就是为什么你得到双源(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 -ecat .git/config 以查看它)。要删除它,您可以运行两个git config 步骤,或使用新的git branch --unset-upstream 命令。或者,您将上游设置为新名称,再次使用两个git config 命令或新的git branch --set-upstream-to &lt;upstream&gt; 命令。这些可以使用一些格式,我会编辑它们。 完美!谢谢!不过,其他人似乎过得如此轻松,这似乎仍然很奇怪。呵呵。

以上是关于Git 分支在推送时自动重命名的主要内容,如果未能解决你的问题,请参考以下文章

git分支重命名

git:重命名本地分支失败

Git:重命名分支中的目录

当远程分支在 Git 中重命名时,如何更新我的本地引用?

在本地和远程重命名 Git 分支? [复制]

如何重命名本地 Git 分支?