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


How do I update my local refs when a remote branch has been renamed in Git?

如果团队中的一个开发人员重命名了另一个开发人员也签出的远程分支,那么第二个开发人员更新本地repo的最佳方法是什么,这样他们就不会意外地推到旧的分支名称?


正如您的链接所指出的,没有"重命名一个分支";所以第一个开发人员所做的就是创建一个新的分支,然后从使用它的其他人的下面删除旧的分支[1]。

通过手动处理与分支相关的配置设置等,甚至更危险的是,通过直接入侵元数据,可以独立地更新每个本地repo…但我更喜欢这样的解决方案:

鉴于删除了old-branch-name,并创建了new-branch-name来替代它:

1)在本地获取并创建新分支。

1
2
git fetch -p
git checkout new-branch-name

注意fetch-p参数,这将导致old-branch-name的远程跟踪参考消失(因为old-branch-name不再在远程)。

假设new-branch-name尚未使用(无论是在本地回购中,还是在另一个已配置的远程中),这将创建具有适当跟踪的新分支,并将其签出。然后

1
2
git reset --hard old-branch-name
git branch -D old-branch-name

现在,有很多不同的情况会导致这一点,我们可以通过其中任何一个或所有可能涉及的,但底线是,这使得它看起来像是如果分支一直是new-branch-name

例如,如果你以前

1
2
3
x -- A <--(origin/old-branch-name)
      \
       B <--(old-branch-name)

new-branch-nameorigin份仍在A处,那么fetch -p给你

1
2
3
x -- A <--(origin/new-branch-name)
      \
       B <--(old-branch-name)

checkoutresetbranch -D之后,

1
2
3
x -- A <--(origin/new-branch-name)
      \
       B <--(new-branch-name)

如果new-branch-name的远程拷贝提前了(比如说,给C的),那么回传就会给你

1
2
3
x -- A -- C <--(origin/new-branch-name)
      \
       B <--(old-branch-name)

最后你会

1
2
3
x -- A -- C <--(origin/new-branch-name)
      \
       B <--(new-branch-name)

这与本地分支位于远程服务器后面的正常情况没有什么不同。

就像我说的,有很多场景,所以如果有一个特别的关注点,请随时发表评论,我可以添加它。但是在任何情况下,如果没有"重命名",那么无论您已经处于什么样的集成状态,这都应该有效地用新分支替换旧分支。

[1]这并不是说,如果团队一致同意的流程要求这样做,那么这样做必然是错误的;但这确实意味着,这样做的人应该负责沟通变化,自然的结果是,有人会在原来的流程下重新创建分支。我——而且几乎可以肯定地创造出不同的分支——否则。


如果您在分支上没有任何正在进行的工作,或者没有其他保存名称的原因,那么删除马克·阿德尔斯伯格回答中的旧名称通常是可行的。

如果您确实有理由只重命名它,您可以用两个命令来执行:

  • 重命名分支:git branch -m old-name new-name
  • 将上游改为新名称:git branch --set-upstream-to=origin/new-name new-name

你可以按照另一个顺序来做,你只需要在那时使用正确的名字。