【问题标题】:Renaming a branch in GitHub重命名 GitHub 中的分支
【发布时间】:2012-03-20 11:06:06
【问题描述】:

我刚刚使用

重命名了我的本地分支
git branch -m oldname newname

但这只会重命名分支的本地版本。如何在 GitHub 上重命名?

【问题讨论】:

  • git: rename remote branch 的可能重复项
  • 您检查了管理员设置吗?我目前在 github 上的项目没有任何分支,但你可以在那里重命名 repo,所以我认为你也可以重命名分支。
  • @evanmcdonnal 不,您不能从 GitHub 站点重命名 Git 分支。
  • @gman 对于它的价值,这些答案似乎回答了 OP 问题的精神。从技术严格的角度来看,或者您目前正在研究的相关问题,OP 的问题可能没有得到完美的表述。但是,这个问题并不是来自 git 或 GitHub 的深厚技术背景。从这个角度来看,可以认为这是一个“初学者”或初级问题。因此,它的措辞和回答都适合该受众。令人沮丧,当然,但我认为这个 Q,这些答案是适当/相关的,特别是对于 BLM 之前的 git/Hub 使用 Q。
  • 如果答案只有 git,那么整个问题应该与 this one 的副本一样接近。唯一使它不重复的是它是关于 github 而不是 git,因此答案需要涵盖 git 和 github 之间的差异。

标签: git github branch rename


【解决方案1】:

现在可以通过 GitHub API 使用分支重命名

你可以rename a branch with the GitHub REST API

您可以轻松地run API commands via the gh CLI 都这样:

gh api "repos/{owner}/{repo}/branches/{branch}/rename" -f new_name={newBranch}

【讨论】:

  • 好收获,点赞。
【解决方案2】:

在 GitHub 端,您可以使用新的(2021 年 1 月)“Support for renaming an existing branch”(受保护的分支只能由管理员重命名,见末尾)

关注本教程:https://docs.github.com/en/github/administering-a-repository/renaming-a-branch

见“How do I rename branch on the GitHub website?”。

这是一种更好的方法,因为以这种方式重命名分支(在 github.com 上)将 (source):

  • 重新定位任何打开的拉取请求
  • 根据分支更新任何草稿版本
  • 移动任何明确引用旧名称的分支保护规则
  • 更新用于构建 GitHub 页面的分支(如果适用)
  • 在存储库主页上向存储库贡献者、维护者和管理员显示通知,其中包含更新存储库本地副本的说明
  • 向 git push 到旧分支的贡献者显示通知
  • 将对旧分支名称的 Web 请求重定向到新分支名称
  • 在旧分支名称的 API 请求中返回“永久移动”响应

2021 年 12 月更新:

Restrict renaming protected branches to admins

现在,只有管理员可以重命名受分支保护规则保护的分支。

GitHub 允许仓库协作者重命名仓库中的每个分支,默认分支除外。

当协作者重命名分支时,适用于该分支的任何非通配符分支保护规则也会更改以匹配分支的新名称。

由于只有管理员可以修改分支保护规则,因此受保护分支的重命名现在仅限于管理员用户。

欲了解更多信息,请访问Renaming a branchManaging a branch protection rule

【讨论】:

  • 不幸的是,在撰写本文时,“重新定位任何打开的拉取请求”部分仅适用于“基本”分支,并且与拉取请求关联的“常规”分支仍将关闭 PR问题。
【解决方案3】:

您可以在没有终端的情况下执行此操作。您只需要使用新名称创建一个分支,然后删除旧名称。

创建一个分支

在您的存储库的分支选择器中,只需开始输入一个新分支 姓名。它会给你创建一个新分支的选项:

它将从您当前的上下文中分支出来。例如,如果您在 错误修复分支,它将从错误修复创建一个新分支,而不是 掌握。而是查看提交或标签?它会分支你的代码 从那个特定的版本开始。

删除一个分支

您还会在存储库的“分支”页面中看到一个删除按钮:

作为额外的奖励,它还会为您提供分支的 Pull 的链接 请求,如果有的话。

我只是复制并粘贴以下内容:Create and delete branches

【讨论】:

    【解决方案4】:

    这是Hazarapet Tunanyan's 答案中的附加条件。

    git branch -m old_branch new_branch         # Rename branch locally
    
    
    git push origin :old_branch                 # Delete the old branch
    # You might be getting an error doing the above step, skip to the next step
    
    git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote
    

    您在执行 git push origin :old_branch 时遇到错误,因为您尝试删除的 old_branch 可能是 默认分支

    只需执行其他2个步骤,然后转到github并从设置中更改默认分支,然后您就可以执行git push origin :old_branch

    【讨论】:

      【解决方案5】:

      如前所述,删除 GitHub 上的旧命令并重新推送,尽管使用的命令比必要的要冗长一些:

      git push origin :name_of_the_old_branch_on_github
      git push origin new_name_of_the_branch_that_is_local
      

      稍微剖析一下命令,git push 命令本质上是:

      git push <remote> <local_branch>:<remote_branch>
      

      因此,在没有指定 local_branch 的情况下进行推送基本上意味着“从我的本地存储库中获取任何内容,并将其设为远程分支”。我一直认为这完全是笨拙的,但它就是这样做的。

      Git 1.7 开始,有一种用于删除远程分支的替代语法:

      git push origin --delete name_of_the_remote_branch
      

      正如 @void.pointer 在 cmets 中提到的那样

      请注意,您可以将 2 个推送操作结合起来:

      git push origin :old_branch new_branch

      这将删除旧分支并推送新分支。

      这可以变成一个简单的别名,将远程、原始分支和新分支名称作为参数,在~/.gitconfig

      [alias]
          branchm = "!git branch -m $2 $3 && git push $1 :$2 $3 -u #"
      

      用法:

      git branchm origin old_branch new_branch
      

      请注意,shell 命令中的位置参数在较旧(2.8 之前?)版本的 Git 中存在问题,因此别名可能会根据 Git 版本而有所不同。详情请见this discussion

      【讨论】:

      • 请注意,您可以将 2 个推送操作结合起来:git push origin :old_branch new_branch。这将删除旧分支并推送新分支。
      • 有什么原因不能在删除旧分支之前推送新分支?我个人更喜欢在创建操作成功后进行删除操作的流程,以防万一出现问题。
      • 不起作用。它会简单地将分支以其旧名称放回 Github。
      • @AdamParkin 1. git branch -m new_branch (将 old_branch 重命名为 new_branch) 2. git commit -m 'msg', 3. git push 4. 嗯,old_branch 出现在 Github,Google 问题,我被引导到你的回答 5.git push origin :old_branch(说它已删除) 6.git push origin new_branch... 完成然后说* [new branch] new_branch -&gt; old_branch。回到 Github,old_branch 再次出现。如果我在 Github Web UI 中删除,我可以选择“恢复”,所以推送 new_branch 似乎只是在恢复。
      • 需要注意的一点是,当您重命名分支时,您针对该拉取请求打开的任何拉取请求都将自动关闭。我们不得不重命名分支,然后手动重新打开所有拉取请求......
      【解决方案6】:
      1. 下载 Atlassian Sourcetree(免费)。
      2. 导入存储库的本地克隆。
      3. 在侧边栏中右键单击要重命名的分支。从上下文菜单中选择“重命名分支...”,然后重命名它。
      4. 推送到原点

      【讨论】:

      • 谢谢,但我必须切换到分支并导入它。
      • 链接已损坏 (404)。
      【解决方案7】:

      在 Git 分支上,运行:

      git branch -m old_name  new_name
      

      这将修改本地存储库上的分支名称:

      git push origin :old_name new_name
      

      这会将修改后的名称推送到远程并删除旧分支:

      git push origin -u new_name
      

      它设置本地分支来跟踪远程分支。

      这解决了问题。

      【讨论】:

        【解决方案8】:

        三个简单的步骤

        • git push origin head

        • git branch -m old-branch-name new-branch-name

        • git push origin head

        【讨论】:

        • 不起作用。它所做的只是在 github 上创建一个新分支。它没有重命名分支。 pastebin.com/dDh06HEb
        【解决方案9】:

        就这么简单。为了在本地和远程重命名 Git 分支,请使用这个 sn-p(经过测试并且像魅力一样工作):

        git branch -m <oldBranchName> <newBranchName>
        git push origin :<oldBranchName>
        git push --set-upstream origin <newBranchName>
        

        解释:

        1. 重命名步骤:

        Git 参考: 使用 -m 或 -M 选项 将重命名为 。如果 有一个对应的 reflog,它被重命名以匹配 ,并创建一个 reflog 条目来记住分支 重命名。如果 存在,则必须使用 -M 强制重命名 发生。

        1. 删除步骤:

        Git 参考: git push origin :experimental 找到一个匹配实验性的 ref 原始存储库(例如 refs/heads/experimental),然后将其删除。

        1. 远程存储库步骤更新(用于跟踪的上游参考):

        Git 参考: --set-upstream 对于每个最新或成功推送的分支,添加上游(跟踪)引用,由无参数使用 git-pull[1] 和其他命令。有关详细信息,请参阅 branch..merge in git-config[1].

        【讨论】:

          【解决方案10】:

          在 Git 本地和远程重命名分支

          1.重命名您的本地分支。

          如果您在要重命名的分支上:

          git branch -m new-name
          

          如果你在不同的分支:

          git branch -m old-name new-name
          

          2。删除旧的远程分支并推送新的本地分支。

          git push origin :old-name new-name
          

          3.为新名称的本地分支重置上游分支。

          切换到分支然后:

          git push origin -u new-name
          

          所以结论是:

          git branch -m new-name
          git push origin :old-name new-name
          git push origin -u new-name
          

          【讨论】:

          • 这是给 git 的,GitHub 是在 git 下的,所以它可以工作,它适用于我和其他人
          • 它不起作用。尝试第一步和第二步git branch -m new-name &amp;&amp; git push origin :master new-name。它会失败。如果这个答案只是关于 git 而不是 github 那么这个问题是其他几个问题的重复,应该关闭。如果真的是关于 github,那么答案必须涵盖 github。这个答案没有。
          • 对我来说,我只需要执行第 1 步和第 2 步,并且此过程有效
          【解决方案11】:

          就我而言,我需要一个额外的命令,

          git branch --unset-upstream
          

          让我重命名的分支推送到origin newname

          (为了方便打字)我先git checkout oldname。 然后运行以下命令:

          git branch -m newname &lt;br/&gt; git push origin :oldname*or*git push origin --delete oldname
          git branch --unset-upstream
          git push -u origin newname @987654328 @

          这个额外步骤可能只是必要的,因为我(倾向于)通过git push -u origin oldname 在我的分支上设置远程跟踪。这样,当我签出oldname 时,我随后只需要输入git push 而不是git push origin oldname

          如果我git push origin newbranch之前使用命令git branch --unset-upstream,git 重新创建 oldbranch并将newbranch推送到origin oldbranch --打败我的意图。

          【讨论】:

          • @gman 点了。我的解决方案在 GitHub 存储库的本地 git 副本上重命名分支后,在本地使用 git 远程重命名 GitHub 上的分支。所以也许它可以被认为是一个专门的解决方案,因为当你想使用命令行而不是 GitHub 网站界面时,你有一个本地克隆,你也想更新它。感谢您强调这一区别,并澄清此答案是针对特殊情况,而不是一般解决方案。
          • 问题是 github 将功能与分支联系在一起。尝试将 master 重命名为 main,您的指令将失败。
          【解决方案12】:

          另一种方法是重命名以下文件

          1. 浏览您的项目目录。
          2. .git/refs/head/[branch-name] 重命名为.git/refs/head/new-branch-name
          3. .git/refs/remotes/[all-remote-names]/[branch-name] 重命名为.git/refs/remotes/[all-remote-names]/new-branch-name

          重命名 head 和 remotes 在您的本地 PC 在源/远程服务器上。

          分支现在被重命名(本地和远程!)


          注意

          如果您当前的分支名称包含斜杠 (/),Git 将创建如下目录:

          当前分支名称: "awe/some/branch"

          • .git/refs/head/awe/some/branch
          • .git/refs/remotes/[all-remote-names]/awe/some/branch

          希望分支名称: "new-branch-name"

          1. 浏览您的项目目录。
          2. .git/refs/*/awe/some/ 复制branch 文件。
          3. 把它放在.git/refs/head/
          4. 从所有.git/refs/remotes/*/awe/some/中复制branch文件。
          5. 将它们放入.git/refs/remotes/*/
          6. 将所有复制的branch文件重命名为new-branch-name
          7. 检查目录和文件结构现在是否如下所示:
          • .git/refs/head/new-branch-name
          • .git/refs/remotes/[all-remote-names]/new-branch-name
          1. 在所有远程源/服务器(如果存在)上执行相同操作
          • 信息:在远程服务器上通常没有 refs/remotes/* 目录,因为您已经在远程服务器上;)(好吧,也许在高级 Git 配置中它可能是可能的,但我有没见过)

          分支现在从 awe/some/branch 重命名为 new-branch-name(本地和远程!)

          分支名称中的目录已删除。


          信息:这种方式可能不是最好的,但它仍然适用于可能对其他方式有问题的人

          【讨论】:

            【解决方案13】:

            我找到了三个关于如何更改 Git 分支名称的命令,这些命令是一种更快的方法:

            git branch -m old_branch new_branch         # Rename branch locally
            git push origin :old_branch                 # Delete the old branch
            git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote
            

            如果您需要分步操作,可以阅读这篇精彩的文章:

            How to Rename Git Local and Remote Branches

            【讨论】:

            • git push --set-upstream 是最重要的部分,如果您碰巧在删除远程分支之前使用 github 应用程序在本地更改了分支名称。
            【解决方案14】:

            这篇文章展示了如何轻松地做到这一点。

            1. 要重命名本地Git分支,我们可以使用Git branch -m命令修改名称:

               git branch -m feature1 feature2
              
            2. 如果您只是在寻找重命名远程 Git 分支的命令,就是这样:

               git push -u origin feature2:feature3
              

              在执行此操作之前,请检查分支上是否没有标签。你可以通过git tag 做到这一点。

            【讨论】:

            • “这篇文章”指的是什么?请通过editing your answer 回复,而不是在 cmets 中。
            【解决方案15】:

            这对我有用:

            1. 先创建新分支:

              git push github newname :refs/heads/newname
              
            2. 在 GitHub 站点上,转到设置并将 默认分支 更改为 newname

            3. 删除oldname

              git push github --delete oldname
              

            【讨论】:

              【解决方案16】:

              以下命令对我有用:

              git push origin :old-name-of-branch-on-github
              git branch -m old-name-of-branch-on-github new-name-for-branch-you-want
              git push origin new-name-for-branch-you-want
              

              【讨论】:

              • 这是有效的简短答案。顺便说一句,第一个命令也可以作为答案中的最后一个。
              • 其实我刚做了两次,在github上就可以了。
              • 应该是公认的答案 - 又好又简单。谢谢!
              • 重要的是要提一下您需要签出分支,否则第一个命令只会删除远程分支。
              • 这对old-name-of-branch-on-github 的子分支有何影响?他们会成为new-name-for-branch-you-want 的孩子吗?
              【解决方案17】:

              以下命令在本地重命名分支,删除远程位置上的旧分支并推送新分支,设置本地分支跟踪新远程:

              git branch -m old_branch new_branch
              git push origin :old_branch
              git push --set-upstream origin new_branch
              

              【讨论】:

              • 虽然您的代码 sn-p 可能会解决问题,但您应该描述您的代码的目的是什么(它如何解决问题)。此外,您可能需要检查stackoverflow.com/help/how-to-answer
              【解决方案18】:

              只需删除旧分支并创建新分支。

              示例(仅重命名远程分支):

              git push origin :refs/heads/oldname
              git push origin newname:refs/heads/newname
              

              您可能还应该重命名本地分支并更改推/拉位置的设置。

              【讨论】:

              • 第二个命令不应该是 git push origin newname:refs/heads/newname 吗? master 和 newname 可能不指向同一个提交。
              • "master" 仅作为示例,现在将更改。
              • 也许两个命令的顺序应该颠倒(即先上传新名称,然后删除旧名称)
              • @gman,不按 Git 方式重命名它也会按 Github 方式重命名它吗?
              • 试试看。 git push origin :refs/heads/master
              猜你喜欢
              • 2017-04-27
              • 2014-07-14
              • 1970-01-01
              • 2021-08-08
              • 2022-08-09
              • 2017-04-08
              • 2021-10-25
              • 2016-05-20
              • 1970-01-01
              相关资源
              最近更新 更多