首页 文章

在Git中远程重命名分支

提问于
浏览
355

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

9 回答

  • 447

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

    $ 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" .

  • 260

    如果您真的只想远程重命名分支, without renaming any local branches at the same time ,您可以使用一个命令执行此操作:

    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> 删除旧的远程分支 .

  • -3

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

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

    要从 remote 删除旧分支:

    git push origin :old_branch
    
  • 0

    当然 . 只需在本地重命名分支,推送新分支,然后删除旧分支 .

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

  • -1

    TL; DR

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

    • 删除旧的远程分支( git push [space]:<old_name>ksrb explained);

    • 推入新的远程分支(下面几个答案命令之间的差异) .

    正在删除

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

    $ git push origin:in
    致命:'origin'似乎不是一个致命的git存储库:无法从远程存储库中读取 . 请确保您具有正确的访问权限并且存储库存在 .

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

    我也使用Bitbucket,和其他基于Web的在线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)的答案中的命令是等效的,因为远程ref defaults to origin 如果之前没有定义其他ref:

    来自docs description

    • git push origin -u new_branch = git push -u new_branch

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

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

  • 2

    我不知道为什么,但@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
    
  • 152

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

    git push origin old_branch:new_branch
    git push origin :old_branch
    
  • 10

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

  • 1

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

    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

相关问题