Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从另一个分支完全替换Git中的主分支?_Git_Merge_Git Branch - Fatal编程技术网

如何从另一个分支完全替换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存储库中有两个分支:

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时进行拉取,则他们的拉取将失败(“远程上没有此类引用”)
    • 当在远程主机上重新创建主机时,拉操作将尝试在本地(现在是旧的)主机上合并新主机:大量冲突。他们实际上需要将本地主机硬重设到他们将获取的远程/主机分支,并忘记当前主机

    您应该能够使用“我们的”合并策略用如下seotweak覆盖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:Try
    git push-f origin master
    这可能是在确保您的master可以完全替换之后执行强制更新的最佳方法。值得解释的是,此答案可能会删除原始
    master
    分支中的提交。虽然ergosys的解决方案进行了正确的合并,因此保留了
    master
    中的所有历史记录。我刚刚丢失了原始master中的所有提交。@moberme您可以执行
    git checkout old master&&git push origin old master
    ,以使用旧master创建分支。添加此问题可能为时已晚,但这有什么问题:git结账日