关于分支:在Git中远程重命名分支

Renaming branches remotely in Git

如果有一个存储库我只有git://访问权(通常只会推+拉),那么有没有一种方法可以像我在本地使用git branch -m那样重命名该存储库中的分支?


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

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

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

1
2
$ git fetch origin
$ git remote prune origin

注意:如果旧分支是主分支,则应更改主分支设置。否则,在运行$ git push origin :old-branch-name时,会出现错误"禁止删除当前分支"。


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

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

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

整合@ksrb的评论:这基本上是两个推一个命令,先是git push /:refs/heads/推一个基于旧的远程跟踪分支的新远程分支,然后git push :删除旧的远程分支。


首先签出到要重命名的分支:

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

remote中删除一个旧分支:

1
git push origin :old_branch


当然。只需在本地重命名分支,推送新分支,并推送删除旧分支即可。

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


DR

"重命名"远程分支实际上是一个两步过程(不一定按顺序排列):

  • 删除旧的远程分支(如ksrb所解释的git push [space]:)。
  • 推入一个新的远程分支(下面几个应答命令之间的差异)。

删除

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

1
$ git push origin :in
  • fatal: 'origin' does not appear to be a git repository

  • fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

这可能是因为页面没有加载私钥(TortoisGit会自动加载到页面)。此外,我注意到tortoisegit命令中没有originref(例如git.exe push --progress"my_project" interesting_local:interesting)。

我也在使用BitBucket,作为其他基于Web的在线Git管理器(GitHub、GitLab),我可以直接通过它们的接口(分支页面)删除远程分支:

Delete branch Bitbucket

但是,在TortoisGit中,您还可以通过浏览引用删除远程分支:

Browse References menu

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

TortoiseGit remote branch delete

删除旧的远程分支后,我直接通过TortoisGit推送到一个新的远程分支,只需在推送窗口的remote:字段中键入新名称,该分支就自动创建并在bitback中可见。

但是,如果您仍然喜欢手动操作,那么这个线程中还没有提到的一点是-u=--set-upstream

git push文档来看,-u只是--set-upstream的别名,所以sylvain(-set-upstream new-branch和shashansk(-u origin new_branch的答案中的命令是等效的,因为如果以前没有定义其他引用,远程引用默认为origin

  • git push origin -u new_branch=git push -u new_branch。从文档描述:

    If the configuration is missing, it defaults to origin.

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


我不知道为什么,但是@sylvain defresne的回答对我不起作用。

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

我得把上游的水调平,然后再调一次。以下是我是如何做到的。

1
2
3
4
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name


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

1
2
git push origin old_branch:new_branch
git push origin :old_branch


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


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

1
2
3
4
5
6
7
8
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"

(支票来自此答案)