为本地和远程Git存储库重命名master分支

Alb*_*ert 802 git git-branch

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

我想将它们重命名为master-old本地和远程.那可能吗?对于跟踪的其他用户origin/master(以及经常更新其本地master分支的用户git pull),重命名远程分支后会发生什么?他们git pull仍然会工作还是会抛出一个它再也找不到的错误origin/master

然后,继续,我想创建一个新的master分支(本地和远程).再说一次,在我这样做之后,如果其他用户这样做会发生什么git pull呢?

我想这一切都会带来很多麻烦.是否有一种干净的方式来获得我想要的东西?或者我应该保持master原样,并创建一个新的分支,master-new然后继续在那里工作?

bdo*_*lan 601

最接近重命名的是删除然后在遥控器上重新创建.例如:

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
Run Code Online (Sandbox Code Playgroud)

然而,这有很多警告.首先,没有现成的检出会了解重命名-蹦也不会尝试跟踪分支重命名.如果新的master还不存在,git pull将会出错.如果master已创建新的.拉动将尝试合并mastermaster-old.所以这通常是一个坏主意,除非你得到了之前检查过存储库的每个人的合作.

注意:默认情况下,较新版本的git不允许您远程删除主分支.您可以通过将receive.denyDeleteCurrent配置值设置为远程存储库warnignore远程存储库上来覆盖它.否则,如果您已准备好立即创建新主服务器,请跳过该git push remote :master步骤,然后--force转到该git push remote master步骤.请注意,如果您无法更改遥控器的配置,则无法完全删除主分支!

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

  • 在远程删除master之前,我会在远程创建master-old.我只是偏执狂. (116认同)
  • 如果你可以使用`new-branch-name`和`old-branch-name`而不是`master` /`master-old`,那将是明确的和安全的,因此这是一个普遍的问题. (13认同)
  • 亚里士多德在下面的回答允许你这样做而不删除主人,所以我认为这更好. (6认同)
  • 分支只是一个(名称,哈希)对 - 仅此而已.分支上有reflog,但这永远不会暴露给远程客户端. (2认同)
  • 如果删除的分支(这里:master)没有被其他分支引用,git可能会垃圾收集那个...井......"分支"的所有提交. - 一些git瓷器命令触发垃圾收集. - 因此:首先创建新名称(指向同一个提交),然后删除旧名称. (2认同)

Ari*_*zis 255

假设您目前在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
Run Code Online (Sandbox Code Playgroud)
  1. 首先根据本地存储库中的提交在存储库中创建一个master-old分支.originmaster
  2. 为这个新origin/master-old分支创建一个新的本地分支(它将自动正确设置为跟踪分支).
  3. 现在将您的本地指向您master希望它指向的任何提交.
  4. 最后,masterorigin存储库中强制更改以反映您的新本地master.

(如果您以任何其他方式执行此操作,则至少需要再执行一步以确保master-old正确设置以跟踪origin/master-old.在撰写本文时,其他任何解决方案都不包括此内容.)

  • 这个答案比"答案"更好,我同意,但是对于那些来这里重新命名分支(不是明确掌握)的人来说,第3步没有多大意义. (10认同)
  • 事实证明这是适合我的解决方案.我试图用另一个分支替换master.我做了一个git log -1 origin/what_i_want_as_new_master来获取第3步的$ new_master_commit.在推送(步骤4)之后,其他开发人员将拉动并获取消息"你的分支在295次提交之前超过了master." 为了解决这个问题,我发了一封电子邮件,让他们知道每次运行:git pull; git checkout some_random_branch; git branch -D master; git pull; git checkout master; 基本上,他们需要删除他们的本地主人并拉新版本否则他们在本地错误的位置. (3认同)

Exc*_*bur 155

使用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
Run Code Online (Sandbox Code Playgroud)

  • 要删除远程分支`git push origin --delete old_branch`稍微可读. (12认同)
  • ```--set-upstream```的替代方法如下:一旦你的分支在本地重命名并在原点上删除,只需执行:```git push -u --all``` (9认同)
  • 这不适用于master分支,因为git不允许你删除远程主分支. (4认同)
  • @AlexandreNeto在这种情况下,你可以在第二行之前执行第三行,将默认分支设置为`new_branch`,然后最终用第二行删除远程`master`. (4认同)
  • 非常简单的步骤.这是问题的最佳答案 (3认同)

小智 35

git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为最后必须运行`git branch -d old-branch-name`来删除本地旧分支. (4认同)

dno*_*zay 29

有很多方法可以重命名分支,但我将重点关注更大的问题:"如何让客户快进,而不必在本地搞乱他们的分支".

首先是快速图片: 重命名master分支并允许客户端快进

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

重命名分支:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old
Run Code Online (Sandbox Code Playgroud)

创建新的"主"分支:

# create master from new starting point
git branch master <new-master-start-point>
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

瞧.

git push origin master
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为创建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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!`git merge -s our master-old`是其他答案错过的关键部分.此外,"易于做"并不意味着"易于理解,或找出"似乎是git的大部分情况,但我离题了. (3认同)
  • 我喜欢这样一个事实:没有提到任何删除,并且那些使用上游克隆的人的过渡是"无缝的".谢谢! (3认同)

Cas*_*bel 11

我假设你仍在询问与前一个问题相同的情况.也就是说,master-new在其历史中不会包含master-old.*如果你称为master-new"master",你将有效地重写历史记录.无论你如何进入一个主人不是以前的主人位置的后代的状态,只是它处于那种状态.

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

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

*如果确实如此,这相当于将一些更改推送到master,然后创建一个新的分支.没问题.


Hen*_*zia 8

我尝试时,所选答案失败了.它抛出一个错误: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.
Run Code Online (Sandbox Code Playgroud)

诀窍是在将其推送到远程存储库之前检查到占位符.其余的是自我解释,删除主分支并将其推送到远程存储库应该现在工作.摘录自此处.


归档时间:

查看次数:

276909 次

最近记录:

7 年,5 月 前