git://
访问权限(通常只是推送+拉取)的存储库,是否有一种方法可以像在本地使用git branch -m
一样重命名该存储库中的分支?您只需创建一个具有所需名称的新本地分支,将其推送到远程,然后删除旧的远程分支:
$ 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"。
git fetch origin --prune
(以有效地获取新分支并摆脱不再在远程的引用)。 - DolphinDream-d
或 --delete
替代 :
。 - Zitrax如果你只是想远程重命名分支,而不是同时重命名任何本地分支,你可以使用一个单独的命令来完成:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
我编写了这个脚本 (git-rename-remote-branch),它为以上操作提供了一个方便的快捷方式。
作为Bash函数:
git-rename-remote-branch() {
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : ${FUNCNAME[0]} <remote> <old name> <new name>"
echo "Example : ${FUNCNAME[0]} origin master release"
return 1
fi
git push $1 $1/$2\:refs/heads/$3 :$2
}
为了融入@ksrb的评论:这基本上是在一个单独的命令中进行两次推送,首先使用git push <remote> <remote>/<old_name>:refs/heads/<new_name>
推送一个基于旧的远程跟踪分支的新远程分支,然后使用 git push <remote> :<old_name>
删除旧的远程分支。
git push <remote>/<old_name>:refs/heads/<new_name>
表示推送一个新的远程分支,使用旧的远程分支作为源。
然后 git push [space]:<old_name>
表示删除旧的远程分支。 - ksrbrefs/heads/name
?你不能直接使用name
吗?这样第一个命令就变成了git push <remote> <remote>/<old_name>:<new_name>
。 - Drew Noakes<new_name>
还不存在。如果该分支不存在,Git 要求您使用完整名称,否则 <new_name>
可能也会引用标签名称。 - sschuberthrefs/heads/<new_name>
已经存在,则删除操作仍会成功,导致只有 <remote>/<old_name>
被删除。预先进行一些检查就可以轻松避免这种情况。 - Apeiron首先检出你想要重命名的分支:
git branch -m old_branch new_branch
git push -u origin new_branch
要从远程
中删除旧分支:
git push origin :old_branch
git push -u origin new_branch
),否则重命名后的分支(new_branch)仍会继续跟踪 origin/old_branch。一旦你删除了远程的 old_branch,new_branch仍然会跟踪origin/old_branch,尽管这个分支已经不存在了。 - DolphinDream可以。只需在本地重命名分支,推送新分支,然后删除旧分支。
唯一的问题是仓库的其他用户不会将本地跟踪分支重命名。
更改分支名称,请按以下步骤操作:
完成后获取 origin
"重命名"远程分支实际上是一个两步骤过程(不一定按顺序):
git push [space]:<old_name>
,如ksrb explained所述);我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,出现了以下情况:
这可能是由于 pageant 没有加载 私钥(而 TortoiseGit 会自动加载到 pageant 中)所导致的。此外,我注意到 TortoiseGit 命令中没有$ 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.
origin
引用(例如:git.exe push --progress "my_project" interesting_local:interesting
)。在删除旧的远程分支后,通过 TortoiseGit 直接将新名称输入到 Push 窗口的 Remote: 字段中,我成功地将代码推送到了一个新的远程分支,并且这个分支会自动在 Bitbucket 上创建并显示。
然而,如果您仍然喜欢手动操作,本文中还未提及的一点是,-u
= --set-upstream
。
根据 git push
文档,-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
,意思是从文档描述中可以看到:如果缺少配置,默认为origin
。最终,我没有手动输入或使用其他答案中建议的任何命令,因此这可能对其他遇到类似情况的人有用。
origin
。你必须按照运行命令 git remote
获取到的名称来命名你的远程库。Git 使用 ssh
,这意味着你正在使用公钥和私钥。我假设 TortoiseGit 的 Autoload Putty keys
只是自动加载所需的密钥,以便你可以对远程引用进行任何操作。最后一件事是,git push -u
不是将内容推送到远程分支的别名,而是将内容推送到本地创建但其远程引用尚未拥有该分支的远程分支的别名。 - juanecabellob-u
是 --set-upstream
的别名,"如果配置缺失,则默认为 origin
"(参见git-push文档)。Sylvain 和 Shashank 使用它来 推送到一个新创建的远程分支。关键问题可能是由于在 shell 上尝试 git push origin :in
时 pageant 没有加载它。所以我不明白你的反对意见,我只是指出了我的答案和其他答案中未解决的细节,并加以解释和解决。 - CPHPython-u
是--set-upstream
的别名,但它不是像你说的那样推送到远程分支的别名。要将更改推送到远程分支,你需要使用git push <remote>
,如果它还没有在远程分支中,则添加git push -u <remote>
。因此,-u
用于在远程创建分支的引用。 - juanecabellob我不知道为什么,但 @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
我不知道这样做是对还是错,但我将分支的“旧名称”推送到分支的“新名称”,然后用以下两行代码完全删除了旧分支:
git push origin old_branch:new_branch
git push origin :old_branch
除了已经给出的答案,这里有一个版本,首先检查新分支是否已经存在(因此您可以在脚本中安全使用它)
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"
(检查来自此答案)
git show-ref --quiet --verify -- refs/heads/$new_name
而不是 ls-remote | cut | sed | grep
。 - Andy
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
。 - sschuberth