重命名本地和远程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。 拉将试图合并master
和master-old
。 所以一般来说这是一个糟糕的主意,除非你之前已经检查过仓库的每个人的合作。
注意:较新版本的git不允许您在默认情况下远程删除主分支。 您可以通过将receive.denyDeleteCurrent
configuration值设置为warn
或ignore
远程存储库来覆盖此设置。 否则,如果您准备立即创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
- 首先根据本地存储库中的
master
提交,在origin
存储库中创build一个master-old
分支。 - 创build一个新的本地分公司为这个新的
origin/master-old
分支(这将自动被设置为一个跟踪分支正确)。 - 现在把你的本地
master
指向你希望它指向的任何提交。 - 最后,在
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
但是如果其他人共享这个存储库,强制推送是一个坏主意。 推力将导致他们的修改历史与新的冲突。
我相信关键是要认识到你正在执行一个双重命名: master
, master-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