如何从另一个分支完全替换Git中的主分支?
我的Git存储库中有两个分支:如何从另一个分支完全替换Git中的主分支?,git,merge,git-branch,Git,Merge,Git Branch,我的Git存储库中有两个分支: git config receive.denyDeleteCurrent ignore git config receive.denyDeleteCurrent true master seotweaks(最初由master创建) 我创建了seotweaks,目的是快速将其合并回master。然而,那是三个月前的事了,这个分支中的代码比master早了13个版本 由于master中的所有代码现在或多或少已经过时,它实际上已经成为我们的工作主分支 我知道这是一个
git config receive.denyDeleteCurrent ignore
git config receive.denyDeleteCurrent true
master
seotweaks
(最初由master
创建)seotweaks
,目的是快速将其合并回master
。然而,那是三个月前的事了,这个分支中的代码比master
早了13个版本
由于master
中的所有代码现在或多或少已经过时,它实际上已经成为我们的工作主分支
我知道这是一个非常糟糕的做法,吸取了教训
您知道如何将master
分支的所有内容替换为seotweaks
中的内容吗
我可以删除
master
中的所有内容并进行合并,但这并不是最佳做法。使用git branch-m将主分支重命名为另一个,然后将seotweaks分支重命名为master怎么样?大概是这样的:
git branch -m master old-master
git branch -m seotweaks master
git push -f origin master
git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks
这可能会删除源主机中的提交,请在运行
git push-f origin master
之前检查您的源主机。您可以重命名/删除远程主机上的主机,但如果很多人都基于远程主机分支并在本地repo中拉取该分支,这将是一个问题。这里可能不是这样,因为每个人似乎都在处理分支“
seotweaks
”
在这种情况下,您可以:git remote--显示可能不起作用。 (请做一个检查,检查您的远程设备在本地回购协议中是如何声明的。我将假定“
来源”
”)(关于GitHub,评论:“我必须再做一步,单击GitHub上的“
Admin
”按钮,将“Default Branch
”设置为“master
”以外的内容,然后再放回原处”)
但是,再一次:
- 如果其他用户试图在远程删除master时进行拉取,则他们的拉取将失败(“远程上没有此类引用”)
- 当在远程主机上重新创建主机时,拉操作将尝试在本地(现在是旧的)主机上合并新主机:大量冲突。他们实际上需要将本地主机硬重设到他们将获取的远程/主机分支,并忘记当前主机
git branch -m master old-master
git branch -m seotweaks master
git push -f origin master
git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks
结果应该是你的主人现在基本上是seotweaks
(-s ours
是--strategy=ours
的缩写)
关于“我们的”战略:
这将解析任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略所有其他分支的所有更改。它旨在取代分支机构的旧发展历史。请注意,这不同于-Xours选项和递归合并策略
从注释更新:如果您遇到致命问题:
拒绝合并不相关的历史记录
,那么将第二行更改为:git合并-允许不相关的历史记录-s ours 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
我发现这是最好的方法(我的服务器不允许我删除) 在托管源存储库的服务器上,从存储库中的目录键入以下内容:
git config receive.denyDeleteCurrent ignore
git config receive.denyDeleteCurrent true
在您的工作站上:
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
回到托管源存储库的服务器上:
git config receive.denyDeleteCurrent ignore
git config receive.denyDeleteCurrent true
感谢博客文章作者的详细回复,当我运行“git push remote:master”时,我得到一个错误-“remote”似乎不是git存储库。@Jason:我将其更改为“origin”,这可能是给远程repo的默认名称。@VonC:我正在git hub存储库上尝试这样做,但当尝试执行“git push origin:master”时,我收到一条消息“[remote rejected]master(禁止删除当前分支)”。至于我为什么这么做。。。基本上,我把事情搞得一团糟,通过github接口和命令行推送导入两次相同的补丁,然后通过手动合并让一切恢复正常。在那之后,我还创建了另一个历史悠久的分支,但为时已晚。。。无论如何由于它在我的个人实验库中,我应该是唯一受影响的。@kris:GitHub默认情况下将拒绝任何推式重写/删除历史记录,除非您强制推送:
git push-f origin:master
。谢谢,这是一个很大的帮助;我还需要做一个额外的步骤,单击github上的“Admin”按钮,并将“Default Branch”设置为“master”以外的值,然后把它放回去afterwards@Jason:Trygit push-f origin master
这可能是在确保您的master可以完全替换之后执行强制更新的最佳方法。值得解释的是,此答案可能会删除原始master
分支中的提交。虽然ergosys的解决方案进行了正确的合并,因此保留了master
中的所有历史记录。我刚刚丢失了原始master中的所有提交。@moberme您可以执行git checkout old master&&git push origin old master
,以使用旧master创建分支。添加此问题可能为时已晚,但这有什么问题:git结账日