【问题标题】:How to replace master branch in Git, entirely, from another branch? [duplicate]如何从另一个分支完全替换 Git 中的主分支? [复制]
【发布时间】:2011-02-21 04:46:57
【问题描述】:

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

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

我创建seotweaks 的目的是快速将其合并回master。不过那是三个月前的事了,这个分支的代码比master早了13个版本。

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

我知道的非常糟糕的做法,吸取了教训。

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

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

【问题讨论】:

  • re:完全重复的标志——这可能是真的,但 ergosys 下面的答案比该问题的公认答案更好,IMO
  • 请注意,它可能被声明为重复,但它是网络搜索“git delete branch master”的第一个命中
  • 这些点对于专门的重复狂热者来说很少重要。
  • 此外,这个问题的措辞更好,并且没有在回答开始后添加到问题中的“额外”评论引起的混乱。
  • 你也可以查看这个解决方案stackoverflow.com/a/3790682/1770571

标签: git merge git-branch


【解决方案1】:

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

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

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

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

来自the docs 关于“我们的”战略:

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

来自 cmets 的更新:如果您遇到致命错误:refusing to merge unrelated histories,则将第二行更改为:git merge --allow-unrelated-histories -s ours master

【讨论】:

  • 添加这个问题可能为时已晚,但这有什么问题:git checkout master;git merge -s theirs seotweaks - 节省了几个步骤。
  • @Joel Berger,递归合并选项将混合两个分支,仅在冲突时支持“他们的”或“我们的”。因此,您将从两个分支中获得更改。
  • 这对我不起作用。当我从另一个分支执行“git merge -s ours master”时,我得到“已经是最新的”。还有什么我可以尝试的吗?
  • 对我不起作用
  • 如果得到fatal: refusing to merge unrelated histories,则将第二行改为:git merge --allow-unrelated-histories -s ours master
【解决方案2】:

使用 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 之前检查您的原始主机。

【讨论】:

  • @Jason:试试git push -f origin master
  • 这可能是在确保您的 master 可以完全替换后进行强制更新的最佳方式
  • 值得解释的是,这个答案可能会删除原始 master 分支中的提交。而 ergosys 的解决方案进行了适当的合并,因此保留了 master 中的所有历史记录。
  • 废话,我刚刚丢失了原始 master 中的所有提交。
  • @moberme 你可以用git checkout old-master && git push origin old-master 用老主人创建一个分支。
【解决方案3】:

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

在这种情况下,您可以:
git remote --show 可能不起作用。 (创建一个git remote show 以检查您的远程在本地存储库中的声明方式。我将假设为'origin')
(关于 GitHub,house9 cmets:“我必须再做一步,单击 GitHub 上的‘Admin’按钮并将‘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 时尝试拉取,他们的拉取将失败(“远程没有此类引用”)
  • 当在远程重新创建 master 时,pull 会尝试将新的 master 合并到其本地(现在是旧的)master 上:很多冲突。他们实际上需要 reset --hard 他们的本地 master 到他们将获取的远程/master 分支,而忘记他们当前的 master。

【讨论】:

  • 感谢您的详细回复,当我运行 'git push remote :master' 时出现错误 - 'remote' 似乎不是 git 存储库。
  • @Jason:我将其更改为“origin”,这可能是您远程仓库的默认名称。
  • @VonC:我正在尝试在 git-hub 存储库上执行此操作,但是在尝试执行 'git push origin :master' 时,我收到一条消息'[remote denied] master(删除当前分支被禁止)'。至于我为什么要这样做……基本上我把事情搞砸了,通过github界面和命令行推送导入两次相同的补丁,然后通过手动合并让一切恢复正常。之后,我还创建了另一个历史清晰的分支,但为时已晚......无论如何。因为它在我的个人实验存储库中,所以我应该是唯一受影响的人。
  • @kriss:GitHub 默认拒绝任何推送重写/删除历史,除非你强制推送:git push -f origin :master
  • 感谢这是一个很大的帮助;我必须做一个额外的步骤,单击 github 上的“Admin”按钮并将“Default Branch”设置为“master”以外的其他内容,然后将其放回
【解决方案4】:

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

【讨论】:

  • 在 Heroku 上不起作用:! [rejected] -> master (non-fast-forward) 错误:未能将一些 refs 推送到 '.git'
  • git push -f origin seotweaks:master 为我工作
  • 这是迄今为止我在工作分支上进行大量更改的最简单方法,其中有许多困难的冲突(由于文件夹被删除和重命名),回到 master。我不知道这是否适用于每种情况(可能不适合),但它对我完全有用,只是将我完成的分支上的所有内容都恢复到 master 上(工作分支在操作后仍然存在,但两个分支似乎现在有相同的提交)。
  • master git 历史在force push 之后是什么样子的?它是否会覆盖master 上的所有文件,即使它们在seotweaks 上没有更改?
【解决方案5】:

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

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

【讨论】:

  • 对我来说,master 分支是默认分支,所以我将默认分支更改为“develop”分支并删除了 master 分支并从所需分支再次创建 master。稍后,如果您愿意,可以再次将“master”分支设为默认分支。
  • 链接已损坏,“拒绝访问”
  • 耻辱。我认为这些博客仍然存在于他的网站上。只是一个断开的链接:(
猜你喜欢
  • 2021-08-30
  • 2011-06-13
  • 2022-12-18
  • 2012-03-01
  • 1970-01-01
  • 2016-03-25
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多