交换主分支和特性分支

33

我们现在处于这样一种情况: master 分支有新的功能需求,而 feature1 分支(从 master 分支分离出来)是主分支中稳定的版本。我们该如何调整它们的位置?也就是说,让 feature1 成为主分支,而 master 成为newfeaturebranch

我找到了一些类似的 SO 问题,但在那些情况下,他们不再关心旧的 master 提交记录。而在这里,我们想保留当前的 master 分支作为新的 newfeaturebranch。

我想到了一种方法:

  1. 从当前的 master 分支创建newfeaturebranch
  2. master 分支回滚/删除到 feature1 分支的分叉点。
  3. feature1 分支合并到 master 分支。
  4. 删除 feature1 分支。
3个回答

41

你可以重命名分支:

git branch -m master newfeaturebranch
git branch -m feature1 master

有趣。那我可以把它们推送到远程(Github)上,然后它就能正常工作了? - Dogweather
1
由于新主分支领先于旧主分支,Git 不会抱怨(只有当您无法快进到它时才会抱怨)。同样,由于 newfeaturebranch 是一个全新的分支名称,远程仓库中还不存在,这也应该可以工作。只有在您想要更新已经“删除”提交的分支时,您需要使用 git push -f 强制推送它。 - poke
谢谢,这个很好用。两个旧分支都有并发提交,因此需要强制操作。但是这种操作是可以预料的:我还创建了每个原始分支的“存档”分支,以防出现任何问题。 - Dogweather
其他人怎么办?如果他们还在旧的主分支上,他们本地的代码库会不会混乱?或者他们现在会自动切换到 newfeaturebranch 分支了吗? - rubo77
1
@rubo77 如果你不仅在本地而且在远程上重命名分支,那么你应该与其他开发人员沟通你做出了这个更改。如果他们尝试合并更改,Git将拒绝这样做如果远程包含较少的提交。在这种情况下,git reset --hard origin/master可以通过扔掉其他所有内容来重置到远程的主分支(因此,如果您有本地更改,您可能需要在单独的分支中备份这些更改)。 - poke
我尝试了这个,结果是特性变成了主分支,而原来的主分支变成了特性。换句话说,原来的主分支消失了。幸运的是,我之前备份了所有内容,所以没有丢失任何东西。 - rhody

7
我开始使用poke的解决方案,但是在推送后,本地分支仍然跟踪旧的远程分支。为了跟踪正确的分支,我只需要在推送时添加“-u”选项。
git branch -m master newfeaturebranch
git branch -m feature1 master

git push -uf origin master
git push -u origin newfeaturebranch

也可以通过两步操作来完成,首先进行推送,然后调整正确的分支以跟踪

git push -f origin master
git push origin newfeaturebranch

git branch -u origin/master master
git branch -u origin/newfeaturebranch newfeaturebranch

0

编辑:在你修改问题并说想要简单地“交换位置”之前,我写了这篇文章。 如果你不需要保留名称,Poke的解决方案就足够了。


你需要一个第三个分支 tmp,就像在编程中交换变量一样:

  • git checkout -b tmp master:从master创建新的tmp分支并切换到它
  • git branch -D master:删除master分支
  • git checkout -b master feature1:从feature1重新创建master
  • git branch -D feature1:删除feature1分支
  • git checkout -b feature1 tmp:从tmp(最初的master所在位置)重新创建newfeaturebranch

1
如果不明确需要,就不应该使用大写的-D标志。仅使用小写的-d即可。 - poke
3
如果他想保留名称,他可以将 newfeaturebranch 重命名为 feature1,因此 Poke 的解决方案是“足够”的无条件的。 - Angstrom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接