题 如何从git中完全替换另一个分支中的master分支? [重复]


可能重复:
在git中将当前分支更改为master 

我的git仓库中有两个分支:

  1. seotweaks(最初由大师创建)

我创建 seotweaks 目的是迅速将其合并回来 master,然而那是3个月前,这个分支的代码是13个版本 master,它有效地成为我们工作的主分支,因为所有的代码 master 现在或多或少已经过时了。

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

你知道我怎么能取代所有的内容 master 分支与那些 seotweaks

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


1287
2018-05-19 03:06


起源


re:完全重复的标志 - 这可能是真的,但下面的ergosys的回答比这个问题的接受答案要好,IMO - mikermcneil
请注意,它可能被声明为重复,但是在网络搜索“git delete branch master”时首次点击 - peterk
这些点很少对专用的复制狂热者有用。 - geotheory
此外,这个问题措辞更好,并且错过了在答案开始后添加到问题中的“额外”评论引起的混乱。 - Rob Osborne


答案:


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

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

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

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

文档 关于'我们的'战略:

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


2242
2018-05-19 04:51



可能为时已晚,无法添加此问题但是这有什么问题:git checkout master; git merge -s他们的seotweaks - 节省了几个步骤。 - Subu Sankara Subramanian
@Joel Berger,递归合并选项将混合两个分支,仅在冲突时支持“他们的”或“我们的”。所以你将从两个分支机构获得变化。 - ergosys
这不适合我。当我从另一个分支“git merge -s our master”时,我得到“已经是最新的”。还有什么我可以尝试的吗? - elsurudo
@elsurudo这可能不是一个错误: stackoverflow.com/a/634575/240633 - ergosys
不适合我 - pratnala


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

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

这可能会删除origin master中的提交,请在跑步前检查您的原点大师 git push -f origin master


373
2018-05-19 03:11



@Jason:试试 git push -f origin master - Koraktor
这可能是确保您的主服务器可以完全更换后进行强制更新的最佳方式 - Hrishi
可能值得解释一下,这个答案可能会删除原始的提交 master 科。虽然ergosys的解决方案做了适当的合并,因此保留了所有的历史 master。 - florisla
废话我刚丢失了原始主人的所有提交。 - moberme
@moberme你可以做到 git checkout old-master && git push origin old-master 用旧主人创建一个分支。 - Sander Visser


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

在这种情况下,你可以:
git remote - 显示可能无法正常工作。 (做一个 git remote show 检查您的本地仓库中如何声明您的遥控器。我会假设'origin“)
(关于GitHub, house9 评论:“我必须再做一个步骤,点击'Admin'GitHub上的按钮并设置'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时,pull将尝试将新主服务器合并到其本地(现在是旧的)主服务器上:许多冲突。他们实际上需要 reset --hard 他们的本地主人他们将获取远程/主分支,并忘记他们当前的主人。

61
2018-05-19 03:57



感谢您的详细回复,当我运行'git push remote:master'时出现错误 - “remote”似乎不是git存储库。 - Jason
@Jason:我将其更改为'origin',这可能是您的远程仓库的默认名称。 - VonC
@VonC:我正在尝试在git-hub存储库上执行此操作,但在尝试执行'git push origin:master'时,我收到一条消息'[remote rejected] master(禁止删除当前分支)'。至于为什么我这样做...基本上我严重混淆了东西,通过github接口和命令行推送导入两次相同的补丁,然后通过手动合并使一切恢复工作。之后我还创建了另一个历史悠久的分支,但为时已晚......无论如何。因为它在我的个人实验库中,我应该是受影响的唯一一个。 - kriss
@kriss:GitHub默认拒绝任何推送重写/删除历史记录,除非你强制推送: git push -f origin :master。 - VonC
谢谢这是一个很大的帮助;我不得不再做一个步骤,点击github上的'Admin'按钮并将'Default Branch'设置为'master'之外的其他内容,然后再将它放回去 - house9


因为seotweaks最初是作为主人的分支创建的,所以将它合并回来是一个好主意。但是,如果你的某个分支机构不是真正的主分支机构,或者你的历史记录是如此不同,你只想删除主分支机构,而不是支持你一直在做的工作的新分支机构。可以做到这一点:

git push [-f] origin seotweaks:master

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

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

并且您没有使用github并且无法访问“管理”选项卡来更改远程仓库的默认分支。此外,这不会导致您通过删除主人遇到的停机时间或竞争条件:

git push origin :master

21
2017-07-25 20:44



不适用于Heroku:! [rejected] <new_branch> - > master(非快进)错误:无法将某些引用推送到'<some_git> .git' - shaioz
git push -f origin seotweaks:master为我工作 - Tom Andersen
优秀的答案:强迫推送节目给老板谁是git。 - nbloqs


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

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

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


1
2017-09-28 13:13



对我来说master分支是默认分支所以我将默认分支更改为'develop'分支并删除master分支并从所需分支再次创建master。如果你想要,你可以再次使'master'分支成为你的默认分支。 - Sharad