使用git将master分支覆盖为另一个分支

17

我在一个Git代码库中有一个非常过时的master分支。

我的所有工作都在另一个分支中完成。

最佳的合并方式是什么?

我不关心master中的任何内容,它已经过时了。


git checkout master && git pull && git merge <your-branch>没有成功吗? - Makoto
4个回答

13
如果你不介意失去主分支的历史记录,只需让 master 指向当前分支的最新提交(你并没有“覆盖”master - 分支 - 本身):
git checkout yourotherbranch
git branch -D master
git checkout -b master

当然,如果你拥有一个远程克隆,那么你就必须

git push -f origin master 

Nota bene:正如标题所示,本文特别适用于替换整个master分支并且删除旧的master。否则,您可以使用git merge master --strategy=ours命令来完成。


1
感谢您认可这个替代方案 - 我想合并应该可以解决问题,但如果他们想要替换整个历史记录,那就是另一回事了。 - Makoto

13

假设你的工作在一个名为 dev 的分支中:

git checkout dev 
git merge --strategy=ours master
git checkout master 
git merge dev
合并选项--strategy=ours旨在用于取代旧的侧支开发历史引用)。

1
这还不够。我们的策略是在主分支上存在而开发分支上不存在的文件冲突时进行处理,但这种情况并未覆盖到。 - Rafael

5
很多关于这些问题都可以用 git merge strategy=ours 解决,但我认为这种方法忽略了问题的重点。我理解这个问题是“我没有遵循良好的实践,基本上主干无用,而我不想从主干中获得任何东西”,对于单人项目来说很普遍。 git push -f origin branch_ive_been_working_for_months:master 完全用你的远程分支替换你的远程主干。然后,在本地检出主干之后,只需执行 git pull origin master 就是我认为直接回答问题的解决方案。

1
这是最简洁的答案,完全满足原帖作者的意图。 - JoeAC

3
完全覆盖(overwrite)并不是合并其他内容,而是放弃它。
git checkout -B master anotherbranch

相较于删除并重新创建,这种方法保留了您的分支设置和reflogs。

如果有一些行政要求需要保留历史记录中无用的提交,请在此之后使用git merge -s ours master@{1}。我更喜欢这个顺序,因为它会生成一个不寻常的合并消息,这将提醒扫描--oneline日志的人合并是不寻常的。


我认为@JoeAC在评论Azeli的答案是唯一满足发布者意图的时候,忽略了这个宝藏。这样做既保留了历史,又抹除了主分支的内容。关于"不寻常的合并信息"的备注是一个巧妙的点睛之笔。 - undefined

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