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

问题描述 投票:0回答:5

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

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

我创建

seotweaks
的目的是快速将其合并回
master
。然而,那是三个月前的事了,这个分支中的代码比
master
提前了13个版本。

它实际上已经成为我们的工作主分支,因为

master
中的所有代码现在或多或少已经过时了。

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

你知道我如何将

master
分支的所有内容替换为
seotweaks
中的内容吗?

我可以删除

master
中的所有内容并合并,但这感觉不是最佳实践。

git merge git-branch
5个回答
3617
投票

您应该能够使用“我们的”合并策略来用这样的seotweaks覆盖master:

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

前两个步骤是一个有用的预防措施,可确保您的本地 master 副本是最新的。结果应该是你的 master 现在基本上是 seotweaks 了。

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

来自文档关于“我们的”策略:

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

评论更新:如果你遇到致命错误:

refusing to merge unrelated histories
,则将第四行更改为:
git merge --allow-unrelated-histories -s ours master


643
投票

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

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

这可能会删除 origin master 中的提交,请在运行之前检查您的 origin master

git push -f origin master


91
投票

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

seotweaks
”上工作。

在这种情况下,您可以:

git remote --show
可能不起作用。 (创建一个
git remote show
来检查您的遥控器在本地存储库中的声明方式。我假设为“
origin
”)
(关于 GitHub,house9 评论:“我必须执行一个额外步骤,单击 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 时尝试拉取,他们的拉取将失败(“
    no such ref on remote
    ”)
  • 当在远程重新创建
    master
    时,拉动将尝试将新的
    master
    合并到本地(现在是旧的)
    master
    :很多冲突。他们实际上需要
    reset --hard
    他们的本地 master 到他们将获取的
    remote/master
    分支,并忘记他们当前的
    master

2022 年更新/注释:

  • master
    现在将被命名为
    main
  • git checkout 自 Git 2.23(2019 年第 3 季度)起已过时:使用
    git switch
    进行分支操作。
    git branch -m main main-old  # rename main on local
    git push origin :main          # delete main on remote
    git push origin main-old       # create main-old on remote
    git switch -c main seotweaks # create a new local main on top of seotweaks
    git push origin main           # create main on remote

53
投票

由于

seotweaks
最初是作为
master
的分支创建的,因此将其合并回来是一个好主意。但是,如果您处于这样一种情况,其中一个分支实际上并不是
master
的分支,或者您的历史非常不同,以至于您只想删除
master
分支以支持您一直在做的新分支你的工作可以做到这一点:

git push [-f] origin seotweaks:master

如果您遇到此错误,这尤其有用:

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

并且您没有使用 GitHub,并且无权访问“管理”选项卡来更改远程存储库的默认分支。此外,这不会导致停机或竞争条件,就像您在删除主节点时可能遇到的那样:

git push origin :master

9
投票

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

在托管

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

© www.soinside.com 2019 - 2024. All rights reserved.