如何同时重命名Git本地和远程分支名称?

1552
我有一个指向远程分支origin/regacy的本地分支master(哎呀,打错字了!)。
我该如何将远程分支重命名为origin/legacy或origin/master?
我尝试过:
git remote rename regacy legacy

但是这个出错了:
错误:无法将配置部分“remote.regacy”重命名为“remote.legacy”

1
请参考以下链接:https://dev59.com/YnI_5IYBdhLWcg3wF_F3 - NaN
1
可能是 如何重命名本地 Git 分支? 的重复问题。 - Vineet Jain
相关问题:在Git中远程重命名分支 - joanis
5
简而言之:1. 切换到本地分支,2. git branch -M 新名称 3. git push -d origin 旧名称 4. git push -u origin 新名称 - aderchox
5
好的回答!我会重新组织一下:
  1. 切换到旧分支 old name
  2. 重命名 git branch –m old-name new-name
  3. 切换到新分支 git checkout new name
  4. 推送更改到新远程分支 git push -u origin new-name
  5. 在 GH 网页上创建 PR,你将会看到新分支和旧分支
  6. 回到分支 new name,现在你可以删除旧分支的远程头部了 git push -d origin old-name。现在本地和远程仓库只有一个新分支包含所有提交记录,旧分支已经安全删除了,在新分支创建后。
- Sumi
显示剩余3条评论
21个回答

2495

图示,可爱的 Git 远程图


有几种方法可以完成这个任务:

  1. 更改本地分支,然后推送您的更改。
  2. 使用新名称将分支推送到远程,同时在本地保留原始名称。

重命名本地和远程

# Rename the local branch to the new name
git branch -m <old_name> <new_name>

# Delete the old branch on remote - where <remote> is, for example, origin
git push <remote> --delete <old_name>

# Or shorter way to delete remote branch [:]
git push <remote> :<old_name>

# Prevent git from using the old name when pushing in the next step.
# Otherwise, git will use the old upstream name instead of <new_name>.
git branch --unset-upstream <new_name>

# Push the new branch to remote
git push <remote> <new_name>

# Reset the upstream branch for the new_name local branch
git push <remote> -u <new_name>

控制台截图


仅重命名远程分支

来源: ptim

# In this option, we will push the branch to the remote with the new name
# While keeping the local name as is
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

重要提示:

当您使用git branch -m(移动)命令时,Git还会将新名称更新到跟踪分支中。

git remote rename legacy legacy

git remote rename尝试更新配置文件中的远程部分。它将把给定名称的远程更名为新名称,但在您的情况下,它没有找到任何内容,因此重命名失败了。

但是它不会做您想做的事情;它将重命名您的本地配置远程名称,而不是远程分支。


注意: Git服务器可能允许您使用Web界面或外部程序(如Sourcetree等)重命名Git分支,但请记住,在Git中所有工作都是在本地完成的,因此建议使用上述命令进行操作。


28
别忘了取消旧上游的设置:git checkout <new_name> ; git branch --unset-upstream - Miguel Ping
3
@MiguelPing的评论很重要。当尝试重新命名已经推送到Github的分支时,删除、本地重命名并重新推送会导致旧名称再次使用。如果在重新推送之前使用--unset-upstream选项,则可以按预期工作。 - Adam Tuttle
8
有没有办法避免在远程旧分支上开放的 PR 自动关闭?我在 GitLab 上遇到了这个问题,当我将代码推送到远程仓库后,旧分支上的 PR 就被关闭了。 - Himanshu Tanwar
3
以下是这个命令的单行版本:OLD=<old>; NEW=<new>; REMOTE=<remote>; git branch -m $OLD $NEW && git push $REMOTE --delete $OLD && git push $REMOTE $NEW && git push $REMOTE -u $NEW - Irek Mirgaleev
4
@JimArcher 是的,因为你需要使用新名称而不是旧名称。我已经更改了它,但原作者没有解释就将其改回来了。 - Adam Burley
显示剩余8条评论

655
如果你不小心给一个分支命名错误并且将其推送到远程存储库,按照下列步骤重命名该分支(参考这篇文章):
  1. 重命名本地分支:

    • 如果你在要重命名的分支上:
      git branch -m 新名称

    • 如果你在其他分支上:
      git branch -m 旧名称 新名称

  2. 删除 旧名称 的远程分支并推送 新名称 的本地分支
    git push origin :旧名称 新名称

  3. 重置 新名称 本地分支的上游分支
    切换到该分支,然后:
    git push origin -u 新名称


5
在完成前两个步骤后,如果您收到有关当前分支指向远程存储库上不存在的分支的错误消息,则第三步可以解决这个问题。 - Kevin Hooke
4
需要了解git push <remote> --delete old_namegit push origin :old-name new-name的区别,以删除分支。 - Ashutosh Chamoli
2
BitBucket用户:如果重命名'master',请在Repo详细信息中将默认分支设置为新分支,以修复第2步的错误。错误信息为:“默认情况下,禁止删除当前分支,因为下一个'git clone'不会导致任何文件被检出,从而导致混淆。您可以在远程存储库中将'receive.denyDeleteCurrent'配置变量设置为'warn'或'ignore',以允许删除当前分支,带有或不带有警告消息。要消除此消息,请将其设置为'refuse'。错误:拒绝删除当前分支:refs/heads/master - Colin
20
其他选择中最简单的一个。 - Abdulla Nilam
4
对于Github和Bitbucket用户,当您运行第二步时,它会创建一个新的远程分支,但您会从远程收到有关“拒绝删除当前分支”的错误。所以只需进入“存储库设置”➔“分支”➔更改默认/主分支➔new_branch_name➔保存。然后再次运行第2步,以便删除旧的远程分支名称。 - Mr-IDE
显示剩余6条评论

168

请使用以下命令检查您当前所在的分支

git branch -a 

切换到您要重命名的分支

git checkout branch_to_rename

使用重命名分支

git branch -m new_name

提交更改

git push origin :old_name new_name

1
这个操作会删除远程旧分支吗? - Nomnom
3
@Nomnom 它确实这样做。 - airush

114
  • 重命名本地分支

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

git branch -m new-name

如果您目前停留在不同的分支上:

git branch -m old-name new-name
  • 删除旧名称的远程分支并推送新名称的本地分支。

保持在目标分支上,并:

git push origin :old-name new-name
  • 重置新命名的本地分支的上游分支。

切换到目标分支,然后执行以下操作:

git push origin -u new-name

6
您的解决方案简单明了。感谢@Vitaliy Andrusishyn分享您的知识。 - Niyongabo Eric
10
如果你在进行PR的讨论,请小心使用git push origin :old-name new-name命令,因为这会关闭你当前打开的PR。该命令用于重命名分支,但请确保不要意外地推送了一个空白分支。 - Sam Lahm
3
在执行git push origin :old-name new-name命令之前,请确保您的默认远程分支没有设置为您想要重命名和删除的当前分支。 - Ekanem Eno
几乎完美简单的解决方案,带有sam-lahm和ekanem-eno警告。谢谢大家。 - seedme

57

看起来有一种直接的方法:

如果你真的只想远程重命名分支(而不同时重命名任何本地分支),你可以用一个单独的命令来完成,如下:

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

在 Git 中远程重命名分支

更多详细信息请参见原答案。


1
在 git 2.20.1 中无法工作。删除了旧分支,但新分支没有被创建。 - Paul Razvan Berg
顺便提一下,如果您初始化了空仓库并设置了源,那么在调用重命名之前,您需要额外执行一条获取命令。请参见https://dev59.com/RGYr5IYBdhLWcg3wIG5u#13928822。 - TarmoPikaro

45

以下是另一种方法。

首先重命名本地分支,然后重命名远程分支。

重命名本地分支:

如果在另一个分支中登录,

git branch -m old_branch new_branch 

如果在同一个分支中登录,

git branch -m new_branch

重命名远程分支:

git push origin :old_branch    // Delete the remote branch

git push --set-upstream origin new_branch   // Create a new remote branch

35

重命名本地分支

 git branch -m <old_name> <new_name>

将您的本地分支从master重命名为legacy
git branch -m master legacy

重命名远程分支

  • 删除旧名称的远程分支。
  • 将新名称的本地分支推送到远程仓库。
git push origin :regacy

git push origin legacy
  • git push origin :regacy 删除了名为regacy的远程分支。
  • git push origin legacy 将本地分支legacy推送到远程仓库,并创建了一个名为legacy的新远程分支。

25
如果您已经将错误的分支名称推送到远程,请执行以下操作:
  1. 切换到要重命名的本地分支

    git checkout <old_name>

  2. 重命名本地分支

    git branch -m <new_name>

  3. 推送 <new_name> 本地分支并重置上游分支

    git push origin -u <new_name>

  4. 删除 <old_name> 远程分支

    git push origin --delete <old_name>

这是基于这篇文章的。

24

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

  1. 首先切换到您想要重命名的本地分支:

    git checkout <old_name>

  2. 通过输入以下命令来重命名本地分支:

    git branch -m <new_name>

  3. 此时,您已经成功重命名了本地分支。如果您已经将 <old_name> 分支推送到远程存储库,请执行以下步骤以重命名远程分支。

    git push origin -u <new_name>

  4. 删除 <old_name> 远程分支:

    git push origin --delete <old_name>

✅ 完成了。您已成功重命名了本地和远程 Git 分支。


23

附上一个简单的代码片段,用于重命名您当前的分支(本地和远程):

git branch -m <oldBranchName> <newBranchName>
git push origin :<oldBranchName>
git push --set-upstream origin <newBranchName>
git branch -m 或者使用 -M 选项来重命名分支,如果原来的分支有相应的 reflog,则会将其重命名以匹配新名称,并创建一个 reflog 来记录分支更名。如果新名称的分支已经存在,则必须使用 -M 选项来强制进行重命名。 特殊的 refspec :(或 +: 以允许非快进式更新)指示 Git 推送 "matching" 分支:对于每个本地存在的分支,如果远程端已经存在同名的分支,则更新远程端上的分支。 --set-upstream 设置's 的跟踪信息,使得是's 的上游分支。如果没有指定,则默认为当前分支。

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