我刚刚重命名了我的本地分支使用

git branch -m oldname newname

但这只是重命名分支的本地版本。我如何在GitHub上重命名一个?


当前回答

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

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

参见“如何在GitHub网站上重命名分支?”。

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

Re-target any open pull requests Update any draft releases based on the branch Move any branch protection rules that explicitly reference the old name Update the branch used to build GitHub Pages, if applicable Show a notice to repository contributors, maintainers, and admins on the repository homepage with instructions to update local copies of the repository Show a notice to contributors who git push to the old branch Redirect web requests for the old branch name to the new branch name Return a "Moved Permanently" response in API requests for the old branch name


2021年12月更新:

Restrict renaming protected branches to admins Now, only admins can rename branches that are protected by branch protection rules. GitHub allows repository collaborators to rename every branch in a repository, with the exception of the default branch. When a collaborator renames a branch, any non-wildcard branch protection rules that apply to that branch are also changed to match the branch's new name. Because only admins can modify branch protection rules, renaming of a protected branch is now limited to admin users. For more information, visit Renaming a branch and Managing a branch protection rule.

其他回答

我找到了三个关于如何更改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

如果你需要循序渐进,你可以阅读这篇很棒的文章:

如何重命名Git本地和远程分支

如前所述,在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提到的。注释中的指针

注意,你可以结合这两个push操作: Git推送源: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命令中的位置参数在较旧的Git版本(2.8之前?)中是有问题的,因此别名可能会根据Git版本而有所不同。有关详细信息,请参阅此讨论。

这是Hazarapet Tunanyan回答的附加条件。

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了。

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

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

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

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

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

导航您的项目目录。 将.git/refs/head/[branch-name]重命名为.git/refs/head/new-branch-name。 将.git/refs/remotes/[all-remote-names]/[branch-name]重命名为.git/refs/remotes/[all-remote-names]/new-branch-name。

重命名本地PC和源/远程服务器上的头和远程。

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


注意

如果你当前的branch-name包含斜杠(/),Git会像这样创建目录:

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

. /文献/头/敬畏/一些/分支 . /文献/遥控器/ [all-remote-names] /敬畏/一些/分支

祝愿分支-name: "new-branch-name"

导航您的项目目录。 从.git/refs/*/awe/some/中复制分支文件。 把它放在。git/refs/head/中。 从所有的。git/refs/remotes/*/awe/some/中复制分支文件。 把它们放在。git/refs/remotes/*/中。 将所有复制的分支文件重命名为new-branch-name。 检查目录和文件结构现在看起来是否像这样:

. / /头/ new-branch-name。参考文献 . /文献/遥控器/ [all-remote-names] / new-branch-name

对所有远程源/服务器(如果存在的话)执行同样的操作

信息:在远程服务器上通常没有refs/remotes/*目录,因为你已经在远程服务器上;)(好吧,也许在高级Git配置中这是可能的,但我从未见过)

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

branch-name中的目录被移除。


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