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

Posted

技术标签:

【中文标题】当远程分支在 Git 中重命名时,如何更新我的本地引用?【英文标题】:How do I update my local refs when a remote branch has been renamed in Git? 【发布时间】:2018-11-28 20:11:47 【问题描述】:

如果团队中的一位开发人员 renames a remote branch 另一位开发人员也已签出,那么第二位开发人员更新其本地 repo 以免意外推送到旧分支名称的最佳方法是什么?

【问题讨论】:

可能在拉取/获取任何新更改之前手动编辑本地 git 配置文件。 【参考方案1】:

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

可以通过手动修改与分支相关的配置设置等来独立更新每个本地存储库 - 或者更危险的是,直接破解元数据......但我更喜欢这样的解决方案:

鉴于old-branch-name 已被删除并创建new-branch-name 来替换它:

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

git fetch -p
git checkout new-branch-name

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

假设new-branch-name 尚未使用(在本地存储库中或在其配置的另一个远程库中),这将创建具有适当跟踪的新分支,并将其签出。那么

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

现在,有很多不同的场景会导致这一点,我们可以遍历其中任何一个或所有可能看起来令人担忧的场景,但最重要的是,这使它看起来就像分支一直是new-branch-name

例如,如果您以前有

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

new-branch-nameorigin 副本仍在A,然后fetch -p 给你

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

checkoutresetbranch -D 之后

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

如果new-branch-name 的远程副本已经升级(例如,升级到C),那么 fetch 就会给你

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

你终于有了

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

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

就像我说的那样,有很多场景,所以如果有一个特别关注的问题,请随时发表评论,我可以添加它。但无论如何,如果没有“重命名”,无论您已经拥有的任何集成状态,这都应该有效地用新分支替换旧分支。


[1] 这并不是说如果团队商定的流程要求这样做就一定是错误的;但这确实意味着执行此操作的人应该对传达更改负责,其自然结果是某人以其原始名称重新创建分支 - 并且几乎肯定会创建不同的分支 - 否则。 p>

【讨论】:

【参考方案2】:

如果您在分支上没有任何正在进行的工作或出于其他原因保存名称,则通常可以删除 Mark Adelsberger's answer 中的旧名称。

如果您确实有理由重命名它,您可以通过两个命令来完成:

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

您可以按其他顺序执行这些操作,您只需要当时使用正确的名称即可。

【讨论】:

以上是关于当远程分支在 Git 中重命名时,如何更新我的本地引用?的主要内容,如果未能解决你的问题,请参考以下文章

text 在git中重命名本地和远程分支

markdown 在Git中重命名远程分支

删除分支后在 Github 中重命名/编辑标签?

如何重命名本地 Git 分支?

Git命令

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