代码之家  ›  专栏  ›  技术社区  ›  Chris Williams

在git中重命名远程分支时,如何更新本地ref?

git
  •  0
  • Chris Williams  · 技术社区  · 6 年前

    如果团队中有一个开发人员 renames a remote branch 另一个开发人员也已经签出了,第二个开发人员更新本地回购的最佳方式是什么,这样他们就不会意外地推到旧的分支名称?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Mark Adelsberger    6 年前

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

    通过独立地与分支相关的配置设置进行手动更新,或者更危险的是,通过直接访问元数据,可以独立地更新每个本地回购协议…但我更喜欢这样的解决方案:

    鉴于 old-branch-name 被删除并且 new-branch-name 是为了替换它而创建的:

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

    git fetch -p
    git checkout new-branch-name
    

    注意 -p 争论到 fetch ,这将导致 旧分支名称 离开 旧分支名称 不再在遥控器上)。

    假设 新分支名称 尚未使用(在本地repo或其另一个配置的远程中),这将创建具有适当跟踪的新分支,并将其签出。然后

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

    现在,有很多不同的情况会导致这一点,我们可以通过任何或所有这些可能看起来有关,但底线是,这使它看起来像是,如果分支一直是 新分支名称 .

    例如,如果您以前

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

    以及 origin 复印件 新分支名称 仍在 A 然后 fetch -p 给你

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

    之后 checkout , reset branch -D 你有

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

    如果 新分支名称 已经前进了 C ),那么取款会给你

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

    最后你会

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

    这与您的本地分支位于远程之后的正常情况没有区别。

    正如我所说,有很多种情况,所以如果有一个特别关注的问题,请随意评论,我可以补充。但无论如何,如果没有“重命名”的话,无论您已经处于什么集成状态,这都应该有效地用新的分支替换旧的分支。


    (1)这并不是说,如果团队同意的过程要求这样做,那就不一定是错误的,但它确实意味着,做这件事的人应该负责传达这种变化,而自然的结果是有人。 重新创建分支在其原来的名字-几乎肯定创造分歧分支-否则。

        2
  •  1
  •   torek    6 年前

    如果您没有任何正在进行的分支工作或其他原因来保存该名称,请删除旧名称,如中所示 Mark Adelsberger's answer 通常是要走的路。

    如果你 有理由重命名它,您可以用两个命令来完成:

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

    你可以按其他顺序做这些,你只需要在那个时候使用正确的名字。