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

主人seoswitches(最初从master创建)

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

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

我知道,这是一个很糟糕的做法,吸取了教训。

你知道我如何将主分支中的所有内容替换为seotings中的内容吗?

我可以删除master和merge中的所有内容,但这并不是最佳做法。


当前回答

您可以重命名/删除远程上的主节点,但如果许多人将工作基于远程主节点分支,并在其本地存储库中提取该分支,这将是一个问题。这里的情况可能不是这样,因为每个人似乎都在处理分支“seotings”。

在这种情况下,您可以:gitremote--show可能不起作用。(制作一个git远程显示,以检查您的远程是如何在本地存储库中声明的。我将假定为“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时尝试拉取,则其拉取将失败(“远程上没有这样的ref”)当在远程上重新创建master时,pull将尝试将新的master合并到本地(现在是旧的)master上:大量冲突。他们实际上需要重新设置——将本地主节点硬到远程/主节点分支,然后忘记当前的主节点。


更新/注释2022:

现在主人的名字是main自git 2.23(2019年第三季度)以来,git checkout已过时:使用git开关进行分支操作。

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

其他回答

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

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

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

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

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

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

评论更新:如果你犯了致命错误:拒绝合并不相关的历史记录,那么将第二行改为:gitmerge--允许不相关历史记录-这是我们的主

您可以重命名/删除远程上的主节点,但如果许多人将工作基于远程主节点分支,并在其本地存储库中提取该分支,这将是一个问题。这里的情况可能不是这样,因为每个人似乎都在处理分支“seotings”。

在这种情况下,您可以:gitremote--show可能不起作用。(制作一个git远程显示,以检查您的远程是如何在本地存储库中声明的。我将假定为“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时尝试拉取,则其拉取将失败(“远程上没有这样的ref”)当在远程上重新创建master时,pull将尝试将新的master合并到本地(现在是旧的)master上:大量冲突。他们实际上需要重新设置——将本地主节点硬到远程/主节点分支,然后忘记当前的主节点。


更新/注释2022:

现在主人的名字是main自git 2.23(2019年第三季度)以来,git checkout已过时:使用git开关进行分支操作。

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

使用gitbranch-m将主分支重命名为另一个分支,然后将seotings分支重命名为master分支怎么样?类似于:

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

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

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

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

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

回到承载源存储库的服务器上:

git config receive.denyDeleteCurrent true

博客作者的功劳http://www.mslinn.com/blog/?p=772

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

git push [-f] origin seotweaks:master

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

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

而且您没有使用GitHub,也没有访问“管理”选项卡来更改远程存储库的默认分支。此外,这不会导致停机时间或比赛条件,因为您可能会通过删除主控球:

git push origin :master