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

Jas*_*son 1549 git merge git-branch

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

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

  1. master
  2. seotweaks(最初创建master)

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

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

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

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

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

erg*_*sys 2661

你应该能够使用"我们的"合并策略用seotweaks覆盖master如下:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks
Run Code Online (Sandbox Code Playgroud)

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

(-s ours简称--strategy=ours)

从关于"我们的"战略的文档:

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

  • 这不适合我.当我从另一个分支"git merge -s our master"时,我得到"已经是最新的".还有什么我可以尝试的吗? (32认同)
  • 可能为时已晚,无法添加此问题,但这有什么问题:git checkout master; git merge -s他们的seotweaks - 节省了几个步骤. (25认同)
  • @Joel Berger,递归合并选项将混合两个分支,仅在冲突时支持"他们的"或"我们的".因此,您将从两个分支机构获得更改. (24认同)
  • 如果你"致命:拒绝合并不相关的历史",那么将第二行更改为:`git merge --allow-unrelated-histories -s our master` (10认同)
  • 不适合我 (7认同)
  • @elsurudo这可能不是一个错误:http://stackoverflow.com/a/634575/240633 (4认同)
  • @ZelluX发布的重命名策略可以更好地解决这个问题.这个答案只会在现有主数据上合并一个已清理的分支 (4认同)
  • 除了VonC的答案,这会引发一些问题,在重命名时,您不会保留旧主服务器的任何非冲突更改.你可能不介意这个,取决于具体情况. (4认同)
  • 当我做第二步时,我变得"致命:拒绝合并不相关的历史".现在我该怎么做? (4认同)
  • @Subu Subramanian,没有这样的选择.见http://repo.or.cz/w/git.git/blob/HEAD:/Documentation/merge-strategies.txt (2认同)
  • 由于我在远程分支机构工作,我需要在每次合并后推送? (2认同)
  • @ergosys 这种方法比 ZelluX 重命名分支的方法有什么优势吗?当您稍后查看合并时,此方法看起来颇具误导性,但也许重命名方法有缺点? (2认同)
  • 哇!! 我们可以将它添加到GIT文档中......严肃地说 (2认同)
  • 这保留了 master 上的所有提交:( 我做错了吗? (2认同)
  • 这不起作用。我现在必须解决冲突。不替换主。与合并 2 个分支没有什么不同。 (2认同)
  • 这会将 master 合并到您的分支中?这不是您想要的 - 您想用另一个分支完全替换 master - 还是我误解了? (2认同)
  • 这仍然在2019年完美运行:D (2认同)
  • 它仍在合并 2 个分支历史...我想用 `seotweaks` 完全替换 `master`... (2认同)

Zel*_*luX 453

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

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master
Run Code Online (Sandbox Code Playgroud)

这可能会删除origin master中的提交,请在运行前检查您的origin master git push -f origin master.

  • @Jason:试试`git push -f origin master` (33认同)
  • 废话我刚丢失了原始主人的所有提交. (33认同)
  • 可能值得解释的是,这个答案可能会删除原始`master`分支中的提交.虽然ergosys的解决方案做了适当的合并,因此保留了`master`中的所有历史记录. (12认同)
  • 这可能是确保您的主服务器可以完全更换后进行强制更新的最佳方式 (9认同)
  • @moberme你可以做`git checkout old-master && git push origin old-master`用旧主人创建一个分支. (3认同)
  • 这就是我一直在寻找的,实际上是完全替换 master 而不是合并(标题确实询问“如何替换 master 分支”)。但是我没有使用最终的 `git push -f origin master`,而是使用 `git branch -u origin/master` 来设置上游。在我的情况下,要删除的更改不在遥控器中。 (3认同)
  • 用`git push origin:seotweaks`结束以从原点移除旧的ref (2认同)

Von*_*onC 73

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

在这种情况下你可以:
git remote --show可能无法正常工作.(做一个git remote show检查你的遥控器如何在你的本地仓库中宣布.我将假设' origin')
(关于GitHub,house9评论:"我必须再做一个步骤,点击AdminGitHub上的' '按钮并设置' 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
Run Code Online (Sandbox Code Playgroud)

但是又一次:

  • 如果其他用户试图在遥控器上删除主设备时拉动,他们的拉动将失败("遥控器上没有这样的参考")
  • 当在远程上重新创建master时,pull将尝试在其本地(现在是旧的)master上合并该新master:许多冲突.他们实际上需要reset --hard他们的本地主人到他们将要获取的远程/主分支,并忘记他们当前的主人.

  • @kriss:GitHub默认拒绝任何推送重写/删除历史记录,除非你强制推送:`git push -f origin:master`. (5认同)
  • 谢谢这是一个很大的帮助; 我不得不再做一个步骤,点击github上的'Admin'按钮并将'Default Branch'设置为'master'之外的其他东西,然后再将它放回去 (4认同)

mho*_*815 31

由于seotweaks最初是作为分支创建的master,因此将其合并为一个好主意.但是,如果您的某个分支机构不是真正的分支机构,master或者您的历史记录是如此不同以至于您只是想要删除master分支机构以支持您正在进行的新分支,那么您可以执行此操作这个:

git push [-f] origin seotweaks:master
Run Code Online (Sandbox Code Playgroud)

如果您收到此错误,这将特别有用:

! [remote rejected] master (deletion of the current branch prohibited)
Run Code Online (Sandbox Code Playgroud)

并且您没有使用GitHub并且无法访问"管理"选项卡来更改远程存储库的默认分支.此外,这不会导致因删除master而遇到的停机时间或竞争条件:

git push origin :master
Run Code Online (Sandbox Code Playgroud)

  • 极好的答案:强行向git展示谁是老板。 (5认同)
  • git push -f origin seotweaks:master为我工作 (3认同)

Sco*_*mer 7

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

在托管origin存储库的服务器上,从存储库内的目录中键入以下内容:

git config receive.denyDeleteCurrent ignore
Run Code Online (Sandbox Code Playgroud)

在您的工作站上:

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
Run Code Online (Sandbox Code Playgroud)

返回托管origin存储库的服务器:

git config receive.denyDeleteCurrent true
Run Code Online (Sandbox Code Playgroud)

感谢博客文章的作者http://www.mslinn.com/blog/?p=772