1938

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

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

我创建seotweaks的目的是快速将其合并回master. 然而,那是三个月前的事了,这个分支中的代码比master.

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

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

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

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

4

5 回答 5

3266

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

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

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

-s ours简称--strategy=ours

从有关“我们的”策略的文档中:

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

从评论更新:如果你得到致命的:refusing to merge unrelated histories,然后将第二行更改为:gitmerge --allow-unrelated-histories -s ours master

于 2010-05-19T04:51:31.177 回答
570

使用 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

于 2010-05-19T03:11:43.567 回答
83

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

但又一次:

  • 如果其他用户在远程删除 master 时尝试拉取,他们的拉取将失败(“远程没有这样的参考”)
  • 当 master 在远程重新创建时,pull 将尝试将该新 master 合并到其本地(现在是旧的)master 上:很多冲突。他们实际上需要将reset --hard本地 master 连接到他们将获取的 remote/master 分支,而忘记他们当前的 master。
于 2010-05-19T03:57:04.710 回答
45

由于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
于 2012-07-25T20:44:42.987 回答
8

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

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

于 2012-09-28T13:13:57.207 回答