如何重命名本地 Git 分支?

11448
如何重命名一个尚未推送到远程仓库的本地分支?
相关链接:
- [重命名本地和远程 Git 仓库的主分支](link1) - [如何同时重命名 Git 的本地和远程分支名称?](link2)
41个回答

18683

重命名当前分支:

git branch -m <newname>

在指向任何分支的情况下重命名分支:

git branch -m <oldname> <newname>

-m的缩写是--move


推送本地分支并重置上游分支:

git push origin -u <newname>

删除远程分支:

git push origin --delete <oldname>

创建一个 git rename 别名的方法:

git config --global alias.rename 'branch -m'

如果在Windows或另一个不区分大小写的文件系统上,仅有名称大小写更改,请使用-M。否则,Git会抛出“分支已存在”错误。

git branch -M <newname>

244
@PandaWood:在推送时,它会添加新分支,但不会删除旧分支。如果使用git push -f --mirror,它将重命名远程分支,但只有在远程仓库要成为当前仓库的副本时才应使用此方法。还请参阅此问题:https://dev59.com/YnI_5IYBdhLWcg3wF_F3 - siride
30
@PandaWood,这取决于push.default的配置方式。默认设置(matching)会将其推送到与名称匹配的远程分支。你需要执行 git push origin <newname>:<oldname> 否则你会创建一个新的远程分支。然而,如果push.default设置为upstream,那么你可以使用push origin head并且东西将被推到远程仓库中的旧名称。 - Erin Stanfill
67
-m 选项的完整名称是 --move,例如,git branch --move master 将当前分支重命名为“master”。 - robenkleene
1
有趣的是,即使在OSX上,重命名似乎也是暂时不区分大小写的。从FB12.show_hide_cols开始,**-m fb12.show_hide_cols给我带来了一个现有分支错误。但是-m fb12.show_hide_col,然后-m fb12.show_hide_cols就让我达到了想要的效果。之后,git branch**只显示了我想要的那个重命名的分支。 - JL Peyret
4
完成此操作后,您还应运行 git push origin :<old_name> <new_name> 命令来更新远程分支名称。 - David Meza
显示剩余10条评论

607
git branch -m old_branch_name new_branch_name

上述命令将更改你的分支名称,但是在使用重命名的分支时必须非常小心,因为它仍然会引用与之关联的旧上游分支(如果有的话)。

如果你想在本地分支重命名为new_branch_name(例如名称)后将一些更改推送到主分支:

git push origin new_branch_name:master (现在更改将进入主分支,但你的本地分支名称是new_branch_name)

更多详情请参见 "如何在Git中重命名本地分支名称"。


460

重命名当前分支:

git branch -m <newname>

215
如果您只是更改大小写,就需要使用“-M”选项来重命名分支,因为git会告诉您该分支已经存在。 - cjspurgeon
然后执行 git push origin HEAD:<oldname> - techkuz

398

以下是重命名分支的步骤:

  1. 切换到需要重新命名的分支
  2. git branch -m <new_name>
  3. git push origin :<old_name>
  4. git push origin <new_name>:refs/heads/<new_name>

编辑(2017年12月01日): 确保运行git status命令并检查新创建的分支是否指向自己的引用,而不是旧的分支。如果发现旧分支的引用,请使用以下命令取消上游关联:

git branch --unset-upstream

4
解释步骤:1 = 切换到本地分支,2 = '移动' 即在本地重命名分支(-m),3 = 将“无内容”推送到远程的旧分支目标(即删除远程分支的引用) - 冒号左侧是“源”,右侧是“目标”,4 = 推送指向新分支的引用(指针)到远程。 - Chris Halcrow
6
@Milind Anantwar,“check that the new branch is pointing to its own ref”是什么意思?你能否解释一下git branch --unset-upstream如何解决你提到的未同步状态问题? - Chris Halcrow

298

当你的分支完成后,重命名分支将会很有用。随着新的内容的到来,你希望在同一分支上开发而不是删除它并创建一个新的分支。

根据我的经验,在Git中重命名本地和远程分支需要执行以下步骤。

引用自Multiple States - Rename a local and remote branch in 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

1
对我来说,这个更好用。在这里,两个步骤给了我以下错误:error: dst ref refs/heads/<old-name> receives from more than one src.; error: failed to push some refs to 'git@uri:foo/bar.git' - Anto
1
你在运行命令 git push origin :old-name new-name 时遇到了问题,对吗? - trungk18

140
到目前为止,答案都是正确的,但是这里有一些额外信息:
使用“-m”(移动)选项可以安全地重命名一个分支,但是要小心使用“-M”,因为它强制重命名,即使已经存在同名分支。以下是来自‘git-branch’手册的摘录:
如果使用了-m或-M选项,则将重命名为。如果有对应的reflog,则会将其重命名为与相匹配,并创建一个reflog条目以记住分支重命名。如果已经存在,则必须使用-M来强制重命名。

它被新的名称/分支覆盖了。例如,如果您在git中有以下分支: 主分支 b1 <-- 当前分支 b2 执行'git branch -M b2'后,您将只有: 主分支 b2 <-- 当前分支b1将不复存在,如果您希望恢复它,应该通过其哈希值检查它。您可以通过键入“git reflog”来查看它。干杯。 - Vanchev
“-M”标志也很有用,如果您只是更正分支名称的大小写,例如将“myBranch”更改为“MyBranch”,则可以强制重命名。(使用“-m”,git返回“fatal: A branch named 'MyBranch' already exists.”) - Jon Schneider

116

1. 重命名

如果它是您当前的分支,请执行以下操作:

git branch -m new_name

如果您想重命名另一个分支

git branch -m old_name new_name

2. 追踪一个新的远程分支

- 如果你的分支已经被推送了,在重命名之后,你需要从远程 Git 仓库中删除它,并让你的新本地分支去追踪一个新的远程分支:


git push origin :old_name
git push --set-upstream origin new_name

如果 old_name 分支是默认分支,您可能会收到错误消息,如“项目的默认分支不能被删除”。在这种情况下,您需要先 git push 创建 new_name 分支,将其更改为默认分支,然后再 git push 删除 old_name 分支。 - Paulo Merson

89

我不明智地给一个分支起了一个以连字符开头的名字,然后切换到了主分支。 我不想 删除 分支,因为里面还有工作。

这两种方法都没有用:

git checkout -dumb-name

git checkout -- -dumb-name

"s, 's 和 \s 也无济于事。 git branch -m 也不行。

下面是我最终解决问题的方法。进入你的工作副本的 .git/refs/heads 目录,找到文件名“-dumb-name”,获取该分支的哈希值。 然后使用以下命令检出它,创建一个新的名称合理的分支,并删除旧的分支。

git checkout {hash}
git checkout -b brilliant-name
git branch -d -- -dumb-name

同上。如果你需要深入挖掘目录结构来完成这个操作,那就一路走到黑,执行 'mv -- -dumb-name brilliant-name' 命令。执行 'git branch -av' 命令,你会看到一个 .git/refs 的目录结构。或者也可以执行 'grep -R ^ .git/refs' 命令直接查看哈希值。 - Dave X
说实话,如果你想采取这种方法,我建议你避免(在我看来很混乱,如果你不知道自己在做什么可能会很危险)通过.git目录进行尝试,而是使用一些常规命令和一些“git log”解析(使用适当的标志显示分支,并找出要从中检出新分支的shasum),然后执行操作。然后,删除那个奇怪命名的分支。我非常讨厌git坚持认为你需要理解它的所有内部工作才能完成某些事情,但非常感激你可以做到这些事情。 - Jon V
在2.10.1+中,使用不良名称创建分支更加困难。如果你不小心这样做了,可以使用git branch -v命令获取分支的短哈希版本(添加-r选项可获取远程分支)。然后,如果需要,可以使用git rev-parse <shorthash>命令获取完整哈希值。 - House of Dexter
你也可以使用 git show-ref 命令,它会给出本地仓库中所有内容的长哈希值。我是指所有的分支/存储/标签等等。 - House of Dexter
当您无法checkout该名称,但可以删除它时,我会认为这是git中的一个错误。 - U. Windl

88

将当前分支重命名为另一个分支名称的方法:

git branch -m <new_name>

这会为您正在使用的当前分支设置新名称。


要重命名另一个分支:

git branch -m <old_name> <new_name>

在这里,您需要提供旧分支名称和新分支名称。


87

只需三个步骤即可在远程和GitHub上复制更改名称:

第一步 git branch -m old_branchname new_branchname

第二步 git push origin :old_branchname new_branchname

第三步 git push --set-upstream origin new_branchname


4
我还需要做一件额外的事情:执行“git push --set-upstream origin new_branchname”命令,这也在@Nomade的答案中提到了。 - Ibrahim Mohamed
@Dev 并非所有情况下都需要更新,但由于使用了 Bitbucket 和 CodeCommit,第三步是必要的。 - Hari_pb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接