在Git中远程重命名分支

时间:2011-01-20 23:30:52

标签: git branch rename

如果有一个我只有git://访问权限的存储库(并且通常只是推拉),有没有办法重命名该存储库中的分支,就像我在本地使用{ {1}}?

9 个答案:

答案 0 :(得分:453)

您只需要创建一个具有所需名称的新本地分支,将其推送到您的远程,然后删除旧的远程分支:

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

然后,要查看旧分支名称,存储库的每个客户端都必须执行:

$ git fetch origin
$ git remote prune origin

注意:如果旧分支是您的主分支,则应更改主分支设置。否则,当您运行$ git push origin :old-branch-name时,您将收到错误"deletion of the current branch prohibited"

答案 1 :(得分:266)

如果您真的只想远程重命名分支,同时不重命名任何本地分支,您可以使用一个命令执行此操作:

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

我编写了这个脚本(git-rename-remote-branch),它提供了一个方便的快捷方式来轻松完成上述操作。

要整合@ ksrb的评论:这基本上做的是在单个命令中推送两个,首先git push <remote> <remote>/<old_name>:refs/heads/<new_name>根据旧的远程跟踪推送新的远程分支分支然后git push <remote> :<old_name>删除旧的远程分支。

答案 2 :(得分:155)

首先结帐到要重命名的分行:

git branch -m old_branch new_branch
git push -u origin new_branch

remote删除旧分支:

git push origin :old_branch

答案 3 :(得分:10)

不确定。只需在本地重命名分支,推送新分支,然后删除旧分支。

唯一真正的问题是存储库的其他用户不会重命名本地跟踪分支。

答案 4 :(得分:2)

TL; DR

&#34;重命名&#34;远程分支实际上是一个两步过程(不一定是有序的):

  • 删除旧的远程分支(git push [space]:<old_name>ksrb explained);
  • 推入新的远程分支(下面几个答案命令之间的区别)。

删除

我使用 TortoiseGit ,当我第一次尝试通过命令行删除分支时,我得到了这个:

$ git push origin :in
     
      
  • 致命:&#39;起源&#39;似乎不是一个git存储库

  •   
  • 致命:无法从远程存储库中读取。

  •   
     

请确保您拥有正确的访问权限并且存储库已存在。

这可能是由于选美未加载私钥 TortoiseGit 自动加载到选美 )。此外,我注意到 TortoiseGit 命令中没有origin引用(例如git.exe push --progress "my_project" interesting_local:interesting)。

我也在使用 Bitbucket ,并且像其他基于网络的在线git管理器那样(GitHub,GitLab),我能够通过他们的界面直接删除远程分支(分支页面) :

Delete branch Bitbucket

但是,在 TortoiseGit 中,您还可以通过浏览参考删除远程分支:

Browse References menu

通过右键单击远程分支(远程列表),删除远程分支选项将显示:

TortoiseGit remote branch delete

删除旧的远程分支后,我只需在 Push的 Remote:字段中输入新名称,直接通过 TortoiseGit 推送到新的远程分支窗口,此分支自动创建并在 Bitbucket 中可见。

但是,如果您仍然希望手动执行此操作,则此线程中尚未提及的一点是-u = --set-upstream

来自git push docs-u只是--set-upstream的别名,因此Sylvain (-set-upstream new-branch)Shashank (-u origin new_branch)的答案中的命令是等效的,因为远程如果之前未定义其他参考,则默认为origin

  • git push origin -u new_branch = git push -u new_branch 来自docs description
      

    如果缺少配置,则默认为origin

最后,我没有手动输入或使用此处其他答案建议的任何命令,所以这可能对类似情况下的其他人有用。

答案 5 :(得分:1)

我不知道为什么,但@Sylvain Defresne的回答对我不起作用。

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

我必须取消设置上游,然后我可以再次设置流。以下是我的做法。

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name

答案 6 :(得分:0)

我不知道这是对还是错,但我把分支的“旧名称”推到分支的“新名称”,然后用以下两行完全删除旧分支:

git push origin old_branch:new_branch
git push origin :old_branch

答案 7 :(得分:-1)

您可以根据旧名称分支创建新分支。就像这样,然后删除旧的分支,结束! enter image description here

答案 8 :(得分:-3)

添加已经给出的答案,这是一个首先检查新分支是否已存在的版本(因此您可以安全地在脚本中使用它)

if git ls-remote --heads "$remote" \
    | cut -f2 \
    | sed 's:refs/heads/::' \
    | grep -q ^"$newname"$; then
    echo "Error: $newname already exists"
    exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(支票来自this answer