我有一个分支主机,它跟踪远程分支源/主机。

我想在本地和远程将它们重命名为master old。这可能吗?

对于跟踪origin/master(并且总是通过git pull更新本地主分支)的其他用户,在我重命名远程分支后会发生什么?他们的git pull是否仍然有效,或者它是否会抛出一个错误,即无法再找到原始/主文件?

接下来,我想创建一个新的主分支(本地和远程)。再次,在我这样做之后,如果其他用户执行git pull,现在会发生什么?

我想这一切都会带来很多麻烦。有没有一种干净的方法可以得到我想要的东西?还是我应该让master保持原样,创建一个新的分支master,然后继续工作?


我假设你仍然在问与你之前的问题相同的情况。也就是说,master new在其历史中不会包含master old。*如果您将master new称为“master”,则实际上您已经改写了历史。不管你如何进入一个状态,在这个状态中,主人不是先前主人地位的后代,只是它处于那个状态。

当master不存在时,其他尝试拉取的用户只会导致其拉取失败(远程上没有这样的引用),一旦它在新的位置再次存在,他们的拉取将不得不尝试将其master与新的远程master合并,就像您在存储库中合并了旧master和新master一样。考虑到您在这里试图做的事情,合并可能会发生冲突。(如果解决了这些问题,并且结果被推回到存储库中,那么你的状态会更糟——这两个版本都是历史。)

简单地回答你的问题:你应该接受在你的历史中有时会有错误。这没关系。这发生在每个人身上。git.git存储库中有还原的提交。重要的是,一旦我们公布了历史,这是每个人都可以信任的。

*如果这样做了,这就相当于将一些更改推到master上,然后在原来的位置创建一个新的分支。没问题。


最接近重命名的方法是删除,然后在远程设备上重新创建。例如:

git branch -m master master-old
git push remote :master         # Delete master
git push remote master-old      # Create master-old on remote

git checkout -b master some-ref # Create a new local master
git push remote master          # Create master on remote

然而,这有很多警告。首先,没有现有的签出会知道重命名-Git不会尝试跟踪分支重命名。如果新的master还不存在,git pull将出错。如果已创建新主控形状。拉将尝试合并master和master old。因此,除非您与之前签出存储库的所有人合作,否则这通常是一个坏主意。

注意:默认情况下,更新版本的Git不允许您远程删除主分支。您可以通过在远程存储库上将receive.denyDeleteCurrent配置值设置为警告或忽略来覆盖此设置。否则,如果您准备立即创建一个新的master,请跳过gitpushremote:master步骤,并将--force传递给gitpushremotemaster步骤。请注意,如果无法更改远程的配置,则无法完全删除主分支!

此警告仅适用于当前分支(通常是主分支);任何其他分支都可以如上所述被删除和重新创建。


git update-ref newref oldref
git update-ref -d oldref newref

关于:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

假设您当前在主机上:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4

首先,根据本地存储库中的主提交,在源存储库中创建一个主旧分支。为此新的源/主旧分支创建一个新的本地分支(将自动设置为跟踪分支)。现在将您的本地主机指向您希望它指向的任何提交。最后,强制原始存储库中的更改主机以反映新的本地主机。

(如果您以任何其他方式执行此操作,则至少需要再执行一步,以确保master old已正确设置为跟踪原始/master old。在撰写本文时发布的其他解决方案中均未包含此项。)


在服务器上登录,转到Git目录并在裸存储库中重命名分支。

这并没有与重新加载同一分支相关的所有问题。实际上,“客户端”将自动识别修改后的名称并更改其远程引用。

之后(或之前)还可以修改分支的本地名称。


当我尝试时,所选答案失败。它抛出一个错误:拒绝删除当前分支:refs/heads/master。我想我会发布适合我的内容:

git checkout master             # If not in master already

git branch placeholder          # Create placeholder branch
git checkout placeholder        # Check out to placeholder
git push remote placeholder     # Push placeholder to remote repository

git branch -d master            # Remove master in local repository
git push remote :master         # Remove master from remote repository.

诀窍是在将占位符推送到远程存储库之前立即检出占位符。其余部分不言自明;删除主分支并将其推送到远程存储库现在应该可以工作了。摘自此处。


git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

在删除旧分支名称之前,您可能必须手动切换到新分支名称


在Git v1.7中,我认为这一点略有改变。现在很容易将本地分支机构的跟踪参考更新到新的远程设备。

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

有很多方法可以重命名分支机构,但我将重点放在更大的问题上:“如何让客户快速前进,而不必在本地处理分支机构”。

首先是一张快速图片:

这实际上很容易做到;但不要滥用它。整个想法取决于合并提交;因为它们允许快进,并将分支的历史与另一分支的历史联系起来。

重命名分支:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

创建新的“主”分支:

# create master from new starting point
git branch master <new-master-start-point>

创建合并提交以具有父子历史记录:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

瞧。

git push origin master

这是因为创建合并提交允许将分支快速转发到新修订。

使用合理的合并提交消息:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

我相信关键是你意识到你正在执行一个双重重命名:从主到主,从主到新。

从所有其他答案中,我综合了这一点:

doublerename master-new master master-old

我们首先要定义doublerename Bash函数:

# doublerename NEW CURRENT OLD
#   - arguments are branch names
#   - see COMMIT_MESSAGE below
#   - the result is pushed to origin, with upstream tracking info updated
doublerename() {
  local NEW=$1
  local CUR=$2
  local OLD=$3
  local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD.

This commit replaces the contents of '$CUR' with the contents of '$NEW'.
The old contents of '$CUR' now lives in '$OLD'.
The name '$NEW' will be deleted.

This way the public history of '$CUR' is not rewritten and clients do not have
to perform a Rebase Recovery.
"

  git branch --move $CUR $OLD
  git branch --move $NEW $CUR

  git checkout $CUR
  git merge -s ours $OLD -m $COMMIT_MESSAGE

  git push --set-upstream --atomic origin $OLD $CUR :$NEW
}

这类似于更改历史的git rebase,因为分支内容非常不同,但不同之处在于客户端仍然可以安全地使用git pull master快速前进。


好的,在本地和远程重命名分支非常简单!。。。

如果你在分支机构,你可以很容易地做到:

gitbranch-m<branch>

否则,您需要执行以下操作:

git分支-m<your_old_branch><your_new_branch>

然后,将删除推送到远程,如下所示:

git推送原点<your_old_branch>

现在你完成了。

如果在尝试推送时遇到上游错误,只需执行以下操作:

git push--设置上游原点<your_new_branch>

我还创建了下图,以显示实际命令行上的步骤。只要按照步骤操作,你就会很好:


您可以执行以下操作:

git -m master master-old #rename current master
git checkout -b master   #create a new branch master
git push -f origin master #force push to master

但如果其他人共享这个存储库,强行推送是个坏主意。强制推送将导致其修订历史与新的修订历史冲突。


这是我所知道的最简单、最“可读”的方式:

使用-m“移动”本地分支

git branch -m my_old_branch_name my_new_branch_name

将“已移动”分支推到远程,使用-u设置“上游”

git push origin -u my_new_branch_name

设置“upstream”实际上是将本地分支“连接”到远程,这样像fetch、pull和push这样的操作就可以工作了。

从远程删除旧分支

git push origin -D <old_name>

您的本地分支已经不存在了,因为您在第一步中“移动”了它。


可以将以下内容保存到shell脚本中以执行该作业:

例如:

remote="origin"

if [ "$#" -eq 0 ] # if there are no arguments, just quit
then
    echo "Usage: $0 oldName newName or $0 newName" >&2
    exit 1
elif
    [ "$#" -eq 1 ] # if only one argument is given, rename current branch
then
    oldBranchName="$(git branch | grep \* | cut -d ' ' -f2)" #save current branch name
    newBranchName=$1
else
    oldBranchName=$1
    newBranchName=$2
fi

git branch -m $oldBranchName $newBranchName

git push $remote :$oldBranchName # Delete old branch on remote
git push --set-upstream $remote $newBranchName # Add new branch name on remote and track it

请注意,这里的默认远程名称“origin”是硬编码的。您可以扩展脚本以使其可配置!

然后,该脚本可以与Bash别名、Git别名一起使用,或者在Sourcetree自定义操作中使用。


转到github.com或其任何位置,单击分支并重命名它。然后在本地运行这些命令:

git branch -m <old-branch-name> <new-branch-name>
git fetch origin
git branch -u origin/<new-branch-name> <new-branch-name>

2022年更新的解决方案

GitHub现在正式支持其用户重命名分支机构,并在GitHub Docs上提供指导。

我已经按照他们的步骤成功地重命名了我的本地和远程分支。

如果URL断开,下面是解决方案。

重命名远程分支

在GitHub.com上,导航到存储库的主页面。在文件列表上方,单击“分支”。在分支列表中,在要重命名的分支的右侧,单击编辑符号。键入分支的新名称并查看信息,然后单击“重命名分支”

在分支名称更改后更新本地克隆

根据GitHub文档:

在GitHub上重命名存储库中的分支后,任何具有存储库本地克隆的合作者都需要更新该克隆。

从计算机上存储库的本地克隆中,运行以下命令用于更新默认分支的名称:

$ git branch -m OLD-BRANCH-NAME NEW-BRANCH-NAME
$ git fetch origin
$ git branch -u origin/NEW-BRANCH-NAME NEW-BRANCH-NAME
$ git remote set-head origin -a

(可选)运行以下命令以删除对旧分支名称的跟踪引用:

$ git remote prune origin