如何从另一个分支完全替换 Git 中的 master 分支?

可能重复:
将当前的 Git 分支设为主分支

我的 Git 存储库中有两个分支:

  1. master
  2. seotweaks (最初由master创建)

我创建了seotweaks ,旨在将其快速合并回master 。但是,那是三个月前的事,该分支中的代码比master早 13 个版本。

这实际上已经成了我们的工作主分支,因为所有的代码master或多或少过时了。

我知道这是非常糟糕的做法,经验教训是。

您知道我如何用seotweaks中的内容替换master分支的所有内容吗?

我只可以删除master并合并中的所有内容,但这并不是最佳实践。

答案

您应该能够使用 “我们的” 合并策略,用 seotweaks 覆盖 master,如下所示:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

结果应该是您的主人现在基本上是 seotweaks。

-s ours--strategy=ours

从有关 “我们的” 策略的文档中

这样可以解析任意数量的 head,但是合并的结果树始终是当前分支 head 的树,有效地忽略了所有其他分支的所有更改。它旨在取代侧支的旧开发历史。请注意,这与递归合并策略的 - Xours 选项不同。

注释更新:如果您致命: refusing to merge unrelated histories ,然后将第二行更改为:git merge --allow-unrelated-histories -s ours master

使用 git branch -m 将 master 分支重命名为另一个分支,然后将 seotweaks 分支重命名为 master 呢?像这样:

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

这可能会删除原始主机中的提交 ,请在运行git push -f origin master之前检查git push -f origin master

您可以在远程上重命名 / 删除主服务器,但是如果很多人将工作基于远程主服务器分支并在本地存储库中拉出该分支,这将是一个问题。
此处可能并非如此,因为每个人似乎都在致力于 “ seotweaks ” 分支。

在这种情况下,您可以:
git remote --show 可能不起作用。 (进行git remote show检查您的本地仓库中如何声明您的 remote。我将假定为 “ origin ”)
(关于 GitHub, house9评论:“我还必须执行另一步骤,单击 GitHub 上的 “ Admin ” 按钮,并将 “ Default Branch ” 设置为除 “ master ” 之外的其他名称,然后再放回去”)

git branch -m master master-old  # rename master on local
git push origin :master          # delete master on remote
git push origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git push origin master           # create master on remote

但是再次:

  • 如果其他用户在远程删除 master 时尝试拉,则他们的拉取将失败(“在远程上没有这样的引用”)
  • 在远程上重新创建 master 时,拉动将尝试将该新 master 合并到其本地(现在是旧的)master 上:冲突很多。实际上,他们需要reset --hard其本地主服务器reset --hard为将要获取的 remote / master 分支,而忘记了当前的主服务器。

由于seotweaks最初是作为master一个分支创建的,因此将其合并回是个好主意。但是,如果您处在其中一个分支实际上不是master分支的情况下,或者您的历史记录是如此不同,以至于您只是想废除master分支,而改用您一直在为您工作的新分支可以做到这一点:

git push [-f] origin seotweaks:master

如果遇到此错误,这特别有用:

! [remote rejected] master (deletion of the current branch prohibited)

而且您没有使用 GitHub,也无权访问 “管理” 选项卡来更改远程存储库的默认分支。此外,这不会像您删除母版时可能遇到的停机或竞赛情况那样:

git push origin :master

我发现这是执行此操作的最佳方法(我的服务器出现问题,无法删除)。

在承载origin存储库的服务器上,从存储库内的目录中键入以下内容:

git config receive.denyDeleteCurrent ignore

在您的工作站上:

git branch -m master vabandoned                 # Rename master on local
git branch -m newBranch master                  # Locally rename branch newBranch to master
git push origin :master                         # Delete the remote's master
git push origin master:refs/heads/master        # Push the new master to the remote
git push origin abandoned:refs/heads/abandoned  # Push the old master to the remote

返回托管origin存储库的服务器:

git config receive.denyDeleteCurrent true

感谢博客文章的作者http://www.mslinn.com/blog/?p=772