ChatGPT解决这个技术问题 Extra ChatGPT

重命名 GitHub 中的分支

我刚刚使用重命名了我的本地分支

git branch -m oldname newname

但这只会重命名分支的本地版本。如何重命名 GitHub 上的那个?

git: rename remote branch 的可能重复项
您是否检查了管理员设置?我当前在 github 上的项目没有任何分支,但你可以在那里重命名 repo,所以我认为你也可以重命名分支。
@evanmcdonnal 不,您不能从 GitHub 站点重命名 Git 分支。
@gman 对于它的价值,这些答案似乎回答了 OP 问题的精神。从技术严格的角度来看,或者您目前正在研究的相关问题,OP 的问题可能没有得到完美的表述。但是,这个问题并不是来自 git 或 GitHub 的深厚技术背景。从这个角度来看,可以认为这是一个“初学者”或初级问题。因此,它的措辞和回答都适合该受众。当然,令人沮丧,但我认为这个 Q,这些答案是适当/相关的,尤其是对于 BLM 之前的 git/Hub 使用 Q。
如果答案只是 git,那么整个问题应该与 this one 重复。唯一使它不重复的是它是关于 github 而不是 git,因此答案需要涵盖 git 和 github 之间的差异。

b
belteshazzar

如前所述,删除 GitHub 上的旧命令并重新推送,尽管使用的命令比必要的要冗长一些:

git push origin :name_of_the_old_branch_on_github
git push origin new_name_of_the_branch_that_is_local

稍微剖析一下命令,git push 命令本质上是:

git push <remote> <local_branch>:<remote_branch>

因此,在没有指定 local_branch 的情况下进行推送基本上意味着“从我的本地存储库中获取任何内容,并将其设为远程分支”。我一直认为这完全是笨拙的,但它就是这样做的。

Git 1.7 开始,有一种用于删除远程分支的替代语法:

git push origin --delete name_of_the_remote_branch

正如@void.pointer 在评论中提到的

请注意,您可以结合 2 个推送操作: git push origin :old_branch new_branch 这将删除旧分支并推送新分支。

这可以在 ~/.gitconfig 中转换为一个简单的别名,将远程、原始分支和新分支名称作为参数:

[alias]
    branchm = "!git branch -m $2 $3 && git push $1 :$2 $3 -u #"

用法:

git branchm origin old_branch new_branch

请注意,shell 命令中的位置参数在较旧的(2.8 之前?)版本的 Git 中存在问题,因此别名可能会根据 Git 版本而有所不同。有关详细信息,请参阅 this discussion


请注意,您可以组合 2 个推送操作:git push origin :old_branch new_branch。这将删除旧分支并推送新分支。
有什么原因在删除旧分支之前无法推送新分支?我个人更喜欢在创建操作成功后进行删除操作的进程,以防万一出现问题。
不工作。它将简单地将分支以其旧名称放回 Github。
@AdamParkin 1. git branch -m new_branch(将 old_branch 重命名为 new_branch)2. git commit -m 'msg',3. git push 4. 嗯,old_branch 出现在 Github,Google 问题中,我被引导到你的答案 5. git push origin :old_branch(说它已删除) 6. git push origin new_branch...完成然后说* [new branch] new_branch -> old_branch。返回 Github,old_branch 再次出现。如果我在 Github Web UI 中删除,我可以选择“恢复”,所以推送 new_branch 似乎只是在恢复。
需要注意的一件事是,当您重命名分支时,您针对该拉取请求打开的任何拉取请求都将自动关闭。我们不得不重新命名分支,然后手动重新打开所有拉取请求......
P
Peter Mortensen

以下命令对我有用:

git push origin :old-name-of-branch-on-github
git branch -m old-name-of-branch-on-github new-name-for-branch-you-want
git push origin new-name-for-branch-you-want

这是有效的简短答案。顺便说一句,第一个命令也可以作为答案中的最后一个。
实际上,我只做了两次,它在 github 上运行。
应该是公认的答案 - 既好又简单。谢谢!
重要的是要提到您需要签出分支,否则第一个命令只会删除远程分支。
这对 old-name-of-branch-on-github 的子分支有何影响?他们会成为 new-name-for-branch-you-want 的孩子吗?
P
Peter Mortensen

我找到了三个关于如何更改 Git 分支名称的命令,这些命令是一种更快的方法:

git branch -m old_branch new_branch         # Rename branch locally
git push origin :old_branch                 # Delete the old branch
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

如果你需要一步一步的,你可以阅读这篇很棒的文章:

How to Rename Git Local and Remote Branches


如果您碰巧在删除远程分支之前使用 github 应用程序在本地更改了分支名称,git push --set-upstream 是最重要的部分。
P
Peter Mortensen

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

1.重命名您的本地分支。

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

git branch -m new-name

如果您在不同的分支上:

git branch -m old-name new-name

2. 删除旧的远程分支,推送新的本地分支。

git push origin :old-name new-name

3. 为新名称的本地分支重置上游分支。

切换到分支,然后:

git push origin -u new-name

所以结论是:

git branch -m new-name
git push origin :old-name new-name
git push origin -u new-name

这是给 git 的,而 GitHub 在 git 下,所以它可以工作,它可以与我和其他人一起使用
它不起作用。尝试第一步和第二步 git branch -m new-name && git push origin :master new-name。它会失败。如果这个答案只是关于 git 而不是 github 那么这个问题是其他几个问题的重复,应该关闭。如果真的是关于 github,那么答案必须涵盖 github。这个答案没有。
对我来说,我只需要执行第 1 步和第 2 步,并且此过程有效
r
rneves

你可以在没有终端的情况下做到这一点。您只需要使用新名称创建一个分支,然后删除旧名称。

创建一个分支 在您的存储库的分支选择器中,只需开始输入一个新的分支名称。它会给你创建一个新分支的选项:它会从你当前的上下文中分支出来。例如,如果您在 bugfix 分支上,它将从 bugfix 而不是 master 创建一个新分支。而是查看提交或标签?它将从该特定版本中分支您的代码。删除分支 您还会在存储库的“分支”页面中看到一个删除按钮:作为额外的奖励,它还会为您提供指向该分支的拉取请求的链接(如果有的话)。

我只是复制并粘贴以下内容:Create and delete branches


V
Vi.

只需删除旧分支并创建新分支。

示例(仅重命名远程分支):

git push origin :refs/heads/oldname
git push origin newname:refs/heads/newname

您可能还应该重命名本地分支并更改推/拉位置的设置。


第二个命令不应该是 git push origin newname:refs/heads/newname 吗? master 和 newname 可能不指向同一个提交。
“主人”只是一个例子,现在会改变。
也许两个命令的顺序应该颠倒(即先上传新名称,然后删除旧名称)
@gman,不将其重命名为 Git 方式也将其重命名为 Github 方式吗?
试试看。 git push origin :refs/heads/master
V
VonC

在 GitHub 端,您可以使用新的(2021 年 1 月)“Support for renaming an existing branch”(受保护的分支只能由管理员重命名,见最后)

遵循本教程:https://docs.github.com/en/github/administering-a-repository/renaming-a-branch

https://i.stack.imgur.com/VLLnY.png

请参阅“How do I rename branch on the GitHub website?”。

这是一种更好的方法,因为以这种方式重命名分支(在 github.com 上)将 (source):

重新定位任何打开的拉取请求

根据分支更新任何草稿版本

移动任何明确引用旧名称的分支保护规则

更新用于构建 GitHub Pages 的分支(如果适用)

在存储库主页上向存储库贡献者、维护者和管理员显示通知,其中包含更新存储库本地副本的说明

向 git push 到旧分支的贡献者显示通知

将对旧分支名称的 Web 请求重定向到新分支名称

在旧分支名称的 API 请求中返回“永久移动”响应

2021 年 12 月更新:

将受保护的分支重命名为管理员现在,只有管理员可以重命名受分支保护规则保护的分支。 GitHub 允许存储库协作者重命名存储库中的每个分支,默认分支除外。当协作者重命名分支时,适用于该分支的任何非通配符分支保护规则也会更改以匹配分支的新名称。因为只有管理员可以修改分支保护规则,受保护分支的重命名现在仅限于管理员用户。有关更多信息,请访问重命名分支和管理分支保护规则。


不幸的是,在撰写本文时,“重新定位任何打开的拉取请求”部分仅适用于“基本”分支,与拉取请求关联的“常规”分支仍将关闭相关 PR。
P
Peter Mortensen

就那么简单。为了在本地和远程重命名 Git 分支,请使用此代码段(经过测试并像魅力一样工作):

git branch -m <oldBranchName> <newBranchName>
git push origin :<oldBranchName>
git push --set-upstream origin <newBranchName>

解释:

重命名步骤:

Git 参考:使用 -m 或 -M 选项, 将重命名为 。如果 有相应的 reflog,则将其重命名以匹配 ,并创建一个 reflog 条目以记住分支重命名。如果 存在,则必须使用 -M 来强制进行重命名。

删除步骤:

Git 参考: git push origin :experimental 在origin仓库(如refs/heads/experimental)中找到一个匹配experimental的ref,并删除它。

更新远程存储库步骤(用于跟踪的上游参考):

Git 参考:--set-upstream 对于每个最新或成功推送的分支,添加上游(跟踪)参考,由无参数的 git-pull[1] 和其他命令使用。有关更多信息,请参阅 git-config[1] 中的 branch..merge。


P
Peter Mortensen

这对我有用:

首先创建新分支: git push github newname :refs/heads/newname 在 GitHub 站点上,转到设置并将默认分支更改为 newname 删除旧名称 git push github --delete oldname


A
Ansh Shrivastava

这是 Hazarapet Tunanyan's 答案中的附加条件。

git branch -m old_branch new_branch         # Rename branch locally


git push origin :old_branch                 # Delete the old branch
# You might be getting an error doing the above step, skip to the next step

git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

您在执行 git push origin :old_branch 时遇到错误,因为您尝试删除的 old_branch 可能是 默认分支

只需执行其他 2 个步骤,然后转到 github 并从设置中更改默认分支,然后您就可以执行 git push origin :old_branch


P
Peter Mortensen

另一种方法是重命名以下文件:

导航您的项目目录。将 .git/refs/head/[branch-name] 重命名为 .git/refs/head/new-branch-name。将 .git/refs/remotes/[all-remote-names]/[branch-name] 重命名为 .git/refs/remotes/[all-remote-names]/new-branch-name。

在本地 PC 和源/远程服务器上重命名 head 和 remotes。

分支现在被重命名(本地和远程!)

注意力

如果您当前的 branch-name 包含斜杠 (/),Git 将创建如下目录:

当前分支名称: "awe/some/branch"

.git/refs/head/awe/some/branch

.git/refs/remotes/[所有远程名称]/awe/some/branch

希望分支名称: "new-branch-name"

导航您的项目目录。从 .git/refs/*/awe/some/ 复制分支文件。把它放在 .git/refs/head/ 中。从所有 .git/refs/remotes/*/awe/some/ 复制分支文件。将它们放在 .git/refs/remotes/*/ 中。将所有复制的分支文件重命名为 new-branch-name。检查目录和文件结构现在是否如下所示:

.git/refs/head/新分支名称

.git/refs/remotes/[all-remote-names]/new-branch-name

在所有远程源/服务器上执行相同操作(如果存在)

信息:在远程服务器上通常没有 refs/remotes/* 目录,因为您已经在远程服务器上;)(好吧,也许在高级 Git 配置中它可能是可能的,但我从未见过)

分支现在从 awe/some/branch 重命名为 new-branch-name (本地和远程!)

分支名称中的目录已删除。

信息:这种方式可能不是最好的,但它仍然适用于可能对其他方式有问题的人


V
VonC

现在可以通过 GitHub API 使用分支重命名

您可以rename a branch with the GitHub REST API

您可以像这样轻松run API commands via the gh CLI

gh api "repos/{owner}/{repo}/branches/{branch}/rename" -f new_name={newBranch}

P
Peter Mortensen

这篇文章展示了如何轻松地做到这一点。

要重命名本地 Git 分支,我们可以使用 Git branch -m 命令修改名称: git branch -m feature1 feature2 如果您只是在寻找重命名远程 Git 分支的命令,就是这样: git push - u origin feature2:feature3 在执行此操作之前,请检查分支上是否没有标签。你可以用 git 标签来做到这一点。


“这篇文章”指的是什么?请通过 editing your answer 回复,不在评论中。
P
Peter Mortensen

就我而言,我需要一个额外的命令,

git branch --unset-upstream

让我重命名的分支推送到 origin newname

(为了便于打字),我先git checkout oldname。然后运行以下命令:

git branch -m newname <br/> git push origin :oldname*or*git push origin --delete oldname
git branch --unset-upstream
git push -u origin newname git push origin newname

这个额外的步骤可能只是必要的,因为我(倾向于)通过 git push -u origin oldname 在我的分支机构上设置远程跟踪。这样,当我签出 oldname 后,我随后只需键入 git push 而不是 git push origin oldname

如果我git push origin newbranch 之前使用命令 git branch --unset-upstream,则 git 重新创建 oldbranch 并将 newbranch 推送到 origin oldbranch - 违背了我的意图.


@gman 点了。我的解决方案在 GitHub 存储库的本地 git 副本上重命名分支后,在本地使用 git 远程重命名 GitHub 上的分支。所以也许它可以被认为是一个专门的解决方案,因为当你想使用命令行而不是 GitHub 网站界面时,你有一个本地克隆,你也想更新它。感谢您强调这种区别,并澄清这个答案是针对特殊情况,而不是一般解决方案。
问题是 github 将功能与分支联系起来。尝试将 master 重命名为 main ,您的指令将失败。
D
David Walschots

以下命令在本地重命名分支,删除远程位置上的旧分支并推送新分支,设置本地分支跟踪新远程:

git branch -m old_branch new_branch
git push origin :old_branch
git push --set-upstream origin new_branch

尽管您的代码片段可能会解决问题,但您应该描述代码的用途(它如何解决问题)。此外,您可能需要检查 stackoverflow.com/help/how-to-answer
P
Peter Mortensen

在 Git 分支上,运行:

git branch -m old_name  new_name

这将修改本地存储库上的分支名称:

git push origin :old_name new_name

这会将修改后的名称推送到远程并删除旧分支:

git push origin -u new_name

它将本地分支设置为跟踪远程分支。

这解决了这个问题。


E
Engineer

下载 Atlassian Sourcetree(免费)。导入存储库的本地克隆。在侧边栏中右键单击要重命名的分支。从上下文菜单中选择“重命名分支...”,然后重命名它。推到原点。


谢谢,但我不得不切换到分支以及导入它。
链接已断开 (404)。
P
Peter Mortensen

三个简单的步骤

git push origin 头部

git 分支 -m 旧分支名称 新分支名称

git push origin 头部


不工作。它所做的只是在 github 上创建一个新分支。它没有重命名分支。 pastebin.com/dDh06HEb