重命名本地和远程Git存储库的主分支

我有跟踪远程分支origin/master分支origin/master

我想在本地和远程将它们重命名为master-old 。 那可能吗? 对于追踪origin/master其他用户(以及经常通过git pull更新本地master分支的用户),重命名远程分支后会发生什么? 他们的git pull仍然工作,否则会抛出一个错误,它无法findorigin/master了?

然后,进一步,我想创build一个新的master分支(本地和远程)。 再次,我做了这个之后,如果其他用户做git pull现在会发生什么?

我想这一切都会造成很大的麻烦。 有一个干净的方式来得到我想要的? 或者我应该离开master ,并创build一个新的分支master-new ,只是在那里继续工作?

最接近重命名的是删除,然后在远程重新创build。 例如:

 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已经创build。 拉将试图合并mastermaster-old 。 所以一般来说这是一个糟糕的主意,除非你之前已经检查过仓库的每个人的合作。

注意:较新版本的git不允许您在默认情况下远程删除主分支。 您可以通过将receive.denyDeleteCurrentconfiguration值设置为warnignore 远程存储库来覆盖此设置。 否则,如果您准备立即创build一个新的主文件,请跳过git push remote :master步骤,并将--force传递到git push remote master步骤。 请注意,如果您无法更改远程的configuration,则无法完全删除主分支!

这个警告只适用于当前分支(通常是master分支); 任何其他分支可以像上面那样被删除和重新创build。

假设你现在是master

 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 
  1. 首先根据本地存储库中的master提交,在origin存储库中创build一个master-old分支。
  2. 创build一个新的本地分公司为这个新的origin/master-old分支(这将自动被设置为一个跟踪分支正确)。
  3. 现在把你的本地master指向你希望它指向的任何提交。
  4. 最后,在origin存储库中强制更改master以反映您的新本地master

(如果以其他方式进行,至less需要多一个步骤才能确保master-old能正确设置origin/master-old 。在撰写本文时,没有任何其他解决scheme已经发布。 )

在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 
 git checkout -b new-branch-name git push remote-name new-branch-name :old-branch-name 

在删除old-branch-name new-branch-name之前,您可能必须手动切换到new-branch-name old-branch-name

重新命名分支有很多种方法,但是我会把重点放在一个更大的问题上: “如何让客户快速前进,而不必在本地混乱分支”

首先是一张快照: 重命名主分支,并允许客户快速前进

这实际上很容易做到; 但不要滥用它。 整个想法取决于合并承诺; 因为它们允许快进,并将分支的历史链接到另一个分支。

重命名分支:

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

创build新的“主”分支:

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

创build合并提交以拥有父子历史logging:

 # 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 

这是有效的,因为创build一个merge提交允许快速转发分支到一个新的版本。

使用明智的合并提交消息:

 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 

我假设你仍然在问你在上一个问题中的情况 。 也就是说,全新的历史不会包含老大。*如果你称之为全新的“主人”,你将有效地重写历史。 不pipe你如何进入一个状态,在这个状态下,主人不是以前的主人位置的后裔,只是处于这种状态。

其他用户试图拉主而不会存在拉只会失败(没有这样的远程参考),一旦它再次存在一个新的地方,他们的拉将不得不尝试合并他们的主人与新的远程主人,就好像您在资源库中合并了master-new和master-new一样。 鉴于你想在这里做什么,合并会有冲突。 (如果他们被解决了,结果被推回到版本库,那么你将处于更糟糕的状态 – 这两个版本的历史。)

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

*如果这样做,这将相当于推动一些变化到主,然后创build一个新的分支,它曾经是。 没问题。

当我尝试它时, 所选答案失败。 它会抛出一个错误: refusing to delete the current branch: refs/heads/master 。 我想我会发布什么适合我:

 git checkout master # if not in master already git branch placeholder # create placeholder branch git checkout placeholder # checkout 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. 

窍门是在将其推送到远程存储库之前检查占位符。 剩下的是自我解释,删除主分支,并推送到远程存储库现在应该工作。 从这里摘录。

好。 我的2美分。 如何在服务器上login,进入git目录并重命名裸仓库中的分支。 这没有与重新上传同一分支相关的所有问题。 实际上,“客户端”会自动识别修改后的名称并更改其远程引用。 之后(或之前),您也可以修改分支的本地名称。

关于什么:

 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 branch -m <branch>

或者如果没有,你需要这样做:

git branch -m <your_old_branch> <your_new_branch>

然后,像这样推送删除到远程:

git push origin <your_old_branch>

现在您已经完成了,如果您在尝试推送时遇到上游错误,只需执行以下操作:

git push --set-upstream origin <your_new_branch>

我也创build下面的图像来显示真正的命令行中的步骤,只要按照步骤,你会很好:

在这里输入图像描述

您可以执行以下操作:

 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 

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

我相信关键是要认识到你正在执行一个双重命名: mastermaster-old master

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

 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快速转发。

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