首页 文章

如何在Git中完全替换另一个分支中的master分支? [重复]

提问于
浏览
1355

可能重复:使当前Git分支成为主分支

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

  • master

  • seotweaks (最初由 master 创建)

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

它已经有效地成为我们的工作主分支,因为 master 中的所有代码现在或多或少都已过时 .

我知道非常糟糕的做法,经验教训 .

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

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

5 回答

  • 65

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

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

    结果应该是你的主人现在基本上是seotweaks .

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

    the docs关于'ours'策略:

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

  • 393

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

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

    This might remove commits in origin master ,请在运行 git push -f origin master 之前检查您的原始主数据 .

  • 2350

    您可以在远程重命名/删除master,但如果很多人将他们的工作 Build 在远程主分支上并且已将该分支拉到本地仓库中,则这将是一个问题 .
    这可能不是这里的情况,因为每个人似乎都在分支' seotweaks '上工作 .

    在这种情况下,你可以:
    git remote - 显示可能无法正常工作 . (制作git remote show以检查您的遥控器在本地仓库中的声明方式 . 我将假设' origin ')
    (关于GitHub,house9评论:“我必须再做一个步骤,点击' Admin ' button on GitHub and set the ' Default Branch ' to something other than ' 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时拉动,则其拉动将失败("no such ref on remote")

    • 当在远程上重新创建master时,pull将尝试在其本地(现在是旧的)master上合并该新master:许多冲突 . 他们实际上需要 reset --hard 他们的本地主人到他们将要获取的远程/主分支,并忘记他们当前的主人 .

  • 22

    由于 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
    
  • 1

    我发现这是最好的方法(我的服务器有问题不让我删除) .

    在承载 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的作者

相关问题