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

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

  1. master
  2. seotweaks(最初创建于master

我创建了seotweaks,目的是将其快速合并回master。然而,那是三个月前,这个分支中的代码比master领先13个版本。

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

我知道非常糟糕的做法,吸取了教训。

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

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

820205 次浏览

使用git分支-m将master分支重命名为另一个分支,然后将seot的分支重命名为master怎么样?类似这样的东西:

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

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

您可以在远程重命名/删除master,但如果很多人都基于远程master分支并在本地存储库中提取该分支,这将是一个问题。
这里可能不是这样,因为每个人似乎都在处理分支“seotweaks”。

在这种情况下,您可以:
git remote --show可能不起作用。(做一个#0来检查您的远程是如何在本地存储库中声明的。我会假设'origin')
(关于GitHub,房子9评论:“我必须做一个额外的步骤,单击GitHub上的'Admin'按钮并将'Default Branch'设置为'master'以外的其他内容,然后将其放回”)

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

但再一次:

  • 如果其他用户在远程删除master时尝试拉取,他们的拉取将失败(“no such ref on remote”)
  • master在远程重新创建时,拉取将尝试将新的master合并到他们的本地(现在是旧的)master上:很多冲突。他们实际上需要将本地主机reset --hard到他们将获取的remote/master分支,并忘记他们当前的master

2022年更新/备注:

    git branch -m main main-old  # rename main on localgit push origin :main          # delete main on remotegit push origin main-old       # create main-old on remotegit switch -c main seotweaks # create a new local main on top of seotweaksgit push origin main           # create main on remote

你应该能够使用“我们的”合并策略来覆盖主seot的像这样:

git checkout mastergit pullgit checkout seotweaksgit merge -s ours mastergit checkout mastergit merge seotweaks

前两个步骤是一个有用的预防措施,以确保您的本地母版副本是最新的。结果应该是您的母版现在基本上是SEOTWINS。

-s ours--strategy=ours的缩写)

的文档关于“我们的”战略:

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

评论更新:如果你得到致命:refusing to merge unrelated histories,然后将第二行更改为:git merge --allow-unrelated-histories -s ours master

由于seotweaks最初是作为master的分支创建的,因此将其合并回来是一个好主意。但是,如果您的某个分支不是来自master的分支,或者您的历史非常不同,以至于您只想删除master分支以支持您一直在做的新分支,您可以这样做:

git push [-f] origin seotweaks:master

如果您遇到此错误,这尤其有用:

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

而且您没有使用GitHub,也无权访问“管理”选项卡来更改远程存储库的默认分支。此外,这不会导致删除master可能遇到的停机时间或竞争条件:

git push origin :master

我发现这是最好的方法(我的服务器不允许我删除)。

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

git config receive.denyDeleteCurrent ignore

在您的工作站:

git branch -m master vabandoned                 # Rename master on localgit branch -m newBranch master                  # Locally rename branch newBranch to mastergit push origin :master                         # Delete the remote's mastergit push origin master:refs/heads/master        # Push the new master to the remotegit 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