Possible Duplicate:
Make the current Git branch a master branch
我的Git存储库中有两个分支:
master
seotweaks(最初由master创建)
我创建了seotweaks,目的是快速将其合并回master。然而,那是三个月前的事了,这个分支中的代码比master早13个版本。
由于master中的所有代码或多或少都已过时,因此它实际上已成为我们的工作主分支。
我知道非常糟糕的做法,吸取了教训。
你知道我如何用seotweaks中的内容替换master分支的所有内容吗?
我可以删除master中的所有内容并合并,但这并不是最佳实践。
- 回复:完全重复的标志——这可能是真的,但是下面的Ergosys的答案比公认的答案更好,imo
- 注意:它可能被声明为一个副本,但它是"git delete branch master"网站搜索的第一个点击。
- 这些点对专门的复式狂热者来说很少重要。
- 此外,这个问题的措词更为恰当,并且遗漏了答案开始后添加到问题中的"额外"注释所造成的混乱。
- 您还可以查看此解决方案stackoverflow.com/a/3790682/1770571
您应该能够使用"我们的"合并策略用如下SEOtweaks覆盖master:
1 2 3 4
| git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks |
结果应该是你的主人现在基本上是搜索引擎优化。
(-s ours是--strategy=ours的缩写)
从有关"我们的"战略的文档中:
This resolves any number of heads, but the resulting tree of the merge is always that of the current branch head, effectively ignoring all changes from all other branches. It is meant to be used to supersede old development history of side branches. Note that this is different from the -Xours option to the recursive merge strategy.
- 这也标记了一个您进行可视化合并的点(Gitk--all或GitLog--all--graph)。随后的合并将从那时起涉及提交。
- 添加这个问题可能为时已晚,但这有什么问题:git checkout master;git merge-s their seotweaks-保存了几个步骤。
- @苏布·萨布拉曼尼亚,没有这样的选择。参见repo.或.cz/w/git.git/blob/head:/documentation/…
- @Ergosys,但是有它们的递归
- @JoelBerger,递归合并选项将混合两个分支,只在冲突时支持"他们的"或"我们的"。所以您将从两个分支中获得更改。
- 这尤其有用,因为我以前在master中合并了分支,然后恢复了在master分支中合并所做的更改。然后我必须在我的另一个分支中对主手册(补丁)进行更改。另一个部门成了新的主管,但我需要改变这个。工作很有魅力。非常感谢你!
- 这很有魅力。在其他地方看到一些似乎过于复杂的答案。
- 这对我不起作用。当我从另一个分支做"git merge-s ours master"时,我会得到"already-up-to-date."还有什么可以尝试的吗?
- @Elsurudo这可能不是一个错误:stackoverflow.com/a/634575/240633
- @你能解释一下你所说的"本质"是什么意思吗?是否有一些边缘情况不起作用?
- 我不是模棱两可的。我不知道有这种情况。
- 因为我在远程分支上工作,所以每次合并后都需要推送吗?
- 不适合我
- 我遇到了与原来发布的完全相同的问题,这种方法在2分钟内用我想要的分支替换了master。谢谢您。
- 下面@zelux发布的重命名策略更好地解决了这个问题。此答案将合并现有主服务器上已清理的分支
- @Ergosys这种方法比Zelux重命名分支的方法有什么优势吗?稍后当您查看合并时,这个方法看起来相当误导,但是重命名方法可能有一个缺点?
- 除了VONC的答案(这会引发一些问题)之外,重命名时不会保留旧主控形状的任何非冲突更改。你可能不介意,视情况而定。
- 我喜欢这个解决方案,因为它在覆盖master之前会在本地保存更改以供验证!!!!
- 哇!!我们能把这个添加到Git文档中吗?严肃地
- 当您已经替换了步骤1和2中的主分支时,为什么需要步骤3和4?
- 为我工作。如果你试图修复像github或bitback这样的远程回购,请记住推两个分支。
- 这就保留了大师的所有承诺:(我做错了吗?
- 这些步骤——看起来像在本地做了些什么,但没有。幸运的是,我首先在新的分支上复制了我的工作目录——将它与我应该更新的"主"分支进行了比较。没有更新任何内容(典型的git)。删除了主分支目录上的文件(除.git外),用更新的分支工作替换了主分支目录中的工作,然后git添加ed和committed-done。教训:在"git"之前进行完整备份。
- 这不起作用。我现在必须解决冲突。不替换master。没有什么不同,然后合并2个分支。
- 这会将master合并到您的分支中吗??这不是你想要的-你想用另一个分支完全取代大师-或者我误解了?
- 我做了这件事,并推动了。实际上,主提交消失了,由分支提交替换。有没有办法撤销这些命令?
- @Renato您可以看到是否可以使用reflog恢复到以前的状态。见gitready.com/intermediate/2009/02/09/…
- @Elsurudo重命名后,最简单的解决方案-将本地开发分支"master"推到远程分支"master"git push origin master:masterstackoverflow.com/questions/2936652/…
- 这种方法对我很有用。我们有一个beta分支被当作master对待,还有一个master分支一年多没有接触过。唯一不同的是,在我将beta合并到master之前,我进行了一次Git推送。"git checkout beta"—>"git merge-s ours master"—>"git push"—>"git checkout master"—>"git merge beta"—>"git push"
- 最简单的是,假设你不在乎失去主人,你可以运行git push -f origin seotweaks:master。
- 为了避免需要提交消息:git merge -s ours --no-commit master。
- 谢谢你,救了我的命
- 当我做第二步时,我得到了fatal: refusing to merge unrelated histories。我现在该怎么办?
- 但是为什么合并提交消息是Merge branch 'master' into other而不是Merge branch 'other' into master?为什么这两个分支上都有承诺?合并在other分支上是没有意义的,因为这个分支应该是在master中合并的分支。
- 据我所知,这实际上把master分支合并成了other分支,然后快速前进到master分支。
- 如果你得到了fatal: refusing to merge unrelated histories,那么把第二行改为:git merge --allow-unrelated-histories -s ours master。
- 这是唯一有效的答案…我试了20次:
- 这在2019年仍然是完美的:d
使用git branch-m将主分支重命名为另一个分支,然后将seothages branch重命名为master怎么样?像这样:
1 2 3
| git branch -m master old-master
git branch -m seotweaks master
git push -f origin master |
这可能会删除源站主服务器中的提交,请在运行git push -f origin master之前检查您的源站主服务器。
- 抱歉,当我运行此程序时,更改仅在本地发生。我如何才能让它影响远程分支?谢谢
- @杰森:试试git push -f origin master。
- 这正是我的工作,谢谢!:)
- 这可能是在确保您的主服务器可以完全替换后执行强制更新的最佳方法。
- 您可以分两步完成:git branch-m oldbranch newbranch;git checkout mynewmaster;git checkout-b master;……好吧,反正有两个——)
- 可能值得解释的是,这个答案可能会删除原来master分支中的承诺。虽然Ergosys的解决方案进行了适当的合并,因此保留了master中的所有历史。
- 废话,我刚刚失去了原来主人的所有承诺。
- 我还发现:stackoverflow.com/a/13307342/339803使用theirs。
- @moberme你可以做git checkout old-master && git push origin old-master来创建一个与旧主人的分支。
- 它对我有用
- 与git push origin :seotweaks定稿,从原点删除旧的ref
- 如果您使用此方法并希望保留两个分支(例如,如果您希望强制来自staging的push代码替换master,但希望保留两个分支之后),只需在强制push之后将两个分支重命名为其原始名称,然后执行git checkout master,并运行git fetch --all和git reset --hard origin/master。这将迫使您的本地master历史与远程的一致。
- 这对Gitlab有效。在进行此操作之前,必须运行跟踪。git checkout seotweaks
- 这实际上不起作用…只是把我的回购协议搞砸了
- 对只重命名分支而不合并投反对票
您可以在远程上重命名/删除master,但如果许多人将工作基于远程master分支,并在本地repo中删除了该分支,则这将是一个问题。这里可能不是这样,因为每个人似乎都在研究"EDOCX1"(1)分支。
在这种情况下,您可以:Git-Remote——显示可能不工作。(制作一个EDOCX1[2]来检查如何在本地报告中声明您的遥控器。我假设‘origin’)(关于GitHub,House9评论道:"我还需要做一个额外的步骤,点击GitHub上的‘Admin’按钮,将‘Default Branch’设置为‘master’以外的东西,然后再放回去。"
1 2 3 4 5
| 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时进行拉取,则其拉取将失败("远程上没有此类引用")。
- 当在远程上重新创建master时,pull将尝试合并本地(现在是旧的)master上的新master:许多冲突。实际上,他们需要将本地主服务器的cx1(7)发送到他们将要获取的远程/主服务器分支,并忘记当前的主服务器。
- 感谢您的详细响应,当我运行"git push remote:master"时,我得到一个错误-"remote"似乎不是git存储库。
- @杰森:我把它改成了"来源",这可能是给远程回购的默认名称。
- @VONC:我正试图在Git Hub存储库上执行此操作,但在尝试执行"Git Push Origin:Master"时,我收到一条消息"[远程拒绝]Master(禁止删除当前分支)"。至于我为什么这么做…基本上,我把事情搞得一团糟,通过Github接口和命令行push导入两倍于相同的补丁,然后通过手动合并使一切恢复正常。在那之后,我还创建了另一个有着清白历史的分支,但为时已晚…不管怎样。因为它在我的个人实验库中,我应该是唯一受影响的人。
- @kris:github默认情况下会拒绝任何推重写/删除历史记录,除非您强制执行:git push -f origin :master。
- 谢谢,这是一个很大的帮助;我还需要做一个额外的步骤,单击Github上的"管理"按钮,将"默认分支"设置为"master"以外的某个值,然后将其放回原来的位置。
- @豪斯9:说得对。我已经编辑了我的答案以包括这一步。
由于seotweaks最初是作为master的分支创建的,因此将其重新合并是一个好主意。但是,如果您的某个分支机构实际上不是来自master的分支机构,或者您的历史如此不同,以至于您只想删除master分支机构以支持您正在进行工作的新分支机构,那么可以这样做:
1
| git push [-f] origin seotweaks:master |
如果出现以下错误,这将特别有用:
1
| ! [remote rejected] master (deletion of the current branch prohibited) |
而且您没有使用github,也没有访问"管理"选项卡来更改远程存储库的默认分支。此外,这不会导致停机或比赛条件,因为您可能会遇到删除主机:
- 不适用于Heroku:![拒绝]->master(non fast forward)error:failed to push some refs to'.git'
- git push-f源代码seotweaks:master为我工作
- 很好的答案是:强迫将节目推给了老板吉特。
我发现这是最好的方法(我的服务器有问题,不允许我删除)。
在托管origin存储库的服务器上,从存储库内的目录中键入以下内容:
1
| git config receive.denyDeleteCurrent ignore |
在您的工作站上:
1 2 3 4 5
| 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存储库的服务器上:
1
| git config receive.denyDeleteCurrent true |
感谢博客文章作者http://www.mslinn.com/blog/?P=772
- 对于我来说,主分支是默认分支,所以我将默认分支更改为"开发"分支,并删除了主分支,然后从所需分支中重新创建了主分支。稍后,如果需要,可以将"master"分支再次设置为默认分支。
- 链接断开,"拒绝访问"。
- 羞耻。我认为他的网站上仍然有博客。只是一个断开的链接:(