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

时间:2010-05-19 03:06:30

标签: git merge git-branch

  

可能重复:
  Make the current Git branch a master branch

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

  1. master
  2. seotweaks(最初由master创建)
  3. 我创建了seotweaks,目的是将其快速合并回master。但是,那是三个月前,这个分支中的代码比master提前了13个版本。

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

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

    您知道如何将master分支的所有内容替换为seotweaks中的内容吗?

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

5 个答案:

答案 0 :(得分:2505)

你应该可以使用“我们的”合并策略用这样的seotweaks覆盖master:

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

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

-s ours--strategy=ours

的缩写

the docs关于“我们的”策略:

  

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

答案 1 :(得分:423)

如何使用git branch -m将master分支重命名为另一个分支,然后将seotweaks分支重命名为master?像这样:

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

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

答案 2 :(得分:70)

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

在这种情况下,你可以:
git remote - 显示可能无法正常工作。 (制作一个git remote show来检查您的遥控器在本地仓库中的声明方式。我将假设“origin”)
(关于GitHub,house9评论:“我必须再做一个步骤,点击GitHub上的'Admin'按钮,然后将'Default Branch'设置为'{{1}以外的其他内容然后把它放回去)“)

master

但是又一次:

  • 如果其他用户试图在遥控器上删除主人时拉,他们的拉动将失败(“遥控器没有这样的参考”)
  • 当在远程上重新创建master时,pull将尝试将新主服务器合并到其本地(现在是旧的)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 他们的本地主人到他们将要获取的远程/主分支,并忘记他们当前的主人。

答案 3 :(得分:25)

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

答案 4 :(得分:2)

我发现这是执行此操作的最佳方式(我的服务器出现问题而不让我删除)。

在托管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

的作者