用develop分支覆盖master分支

5

在我们的项目中,我们的主分支已经完全崩溃了。它认为自己领先几个提交,如果我们尝试将develop分支合并到它上面,将会显示大量冲突。它已经崩溃了很长一段时间,因此在develop分支上发生了很多事情(太多的冲突需要解决)。

我想用develop分支覆盖master分支(使master分支基本等于develop分支)。我该怎么做?

我尝试删除本地master分支中的所有内容,然后运行以下命令:

git checkout master
git reset --hard develop

似乎已经给我了所有正确的文件,但当我尝试推送主分支时,出现了以下错误:
Updates were rejected because the tip of your current branch is behind

1
可能是重复的问题:无法推送到GitHub - 一直提示需要合并 - CodeCaster
请阅读[询问]并展示您所尝试的内容。将该错误粘贴到您喜欢的网络搜索引擎中并阅读结果。 - CodeCaster
@CodeCaster 如果您阅读我的问题,您可能会看到我已经尝试过的部分... - CaribouCode
你尝试了一件事,但结果出现了错误。我想知道你尝试了什么来解决那个错误。 - CodeCaster
@CodeCaster,您建议的重复问题与我遇到的问题不同。我的问题不是如何解决我现在遇到的错误,而是“我想用develop覆盖master中的所有内容”,我该怎么做。在搜索周围时,我看到了许多不同的建议,但我没有找到一个清晰的答案似乎有效。令人沮丧的是,在SO上有像您这样浪费每个人时间的人,他们会对问题进行投票并尝试关闭它(特别是带有不正确的重复票)和无用的评论,例如Google it。 - CaribouCode
如果你想推送一个重写的分支,你需要强制推送。这不是我的错,因为你没有在重复命令中阅读“-f”(或“--force”)参数。所有你收到的答案都像我一样解释了你的问题,并建议你参考重复的内容。 - CodeCaster
3个回答

11
我想用develop分支完全覆盖master分支(使master分支等于develop分支)。如何操作?
使用git-branch命令的--force选项即可实现此目的。
git checkout develop
git branch -f master develop

注意,在修改master之前,需要切换到另一个分支,因为git-branch将拒绝更改当前分支。
或者,您可以使用git-update-ref plumbing命令
git update-ref refs/heads/master refs/heads/develop

该命令允许你修改任何引用,无论HEAD指向哪个位置。请注意,git-update-ref将参数视为相对于.git目录的文件路径

最后,你需要使用-f --force选项的git-push命令来重写远程的master分支:

git push -f origin master

来自文档

通常情况下,“git push”会拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。

如果远程引用的当前值是预期值,则此选项将覆盖此限制。“git push”否则失败。


1

你可以通过使用命令 git checkout master 切换到主分支,并执行以下命令:

git merge --strategy-option theirs develop

这将自动接受开发分支的更改,如果有任何冲突。
这是一个示例
选项2 - 您也可以转到develop分支,删除master,然后像这样重新创建主分支:
git checkout develop
git branch -d master
git push -f :master
git checkout -b master

请记住,如果您使用类似GitLab的工具,您必须首先关闭Protected Branches选项以便对master分支进行操作。


1
你如何推送到主分支?在这种情况下,你不能进行常规推送。
你尝试过使用 git push -f 强制推送吗?强制推送将覆盖远程历史记录,应谨慎操作。
引用块中的内容:
-f --force 通常情况下,该命令拒绝更新不是本地 ref 的祖先的远程 ref。当使用 --force-with-lease 选项时,该命令拒绝更新当前值与期望值不匹配的远程 ref。
此标志禁用了这些检查,并可能导致远程存储库丢失提交。请小心使用。
请注意,--force 应用于所有被推送的 ref,因此将其与 push.default 设置为 matching 或使用 remote.*.push 配置多个推送目标可能会覆盖除当前分支之外的其他 ref(包括严格落后于其远程对应物的本地 ref)。要强制推送到一个分支,请在要推送的 refspec 前面加上 +(例如 git push origin +master 强制推送到主分支)。有关详细信息,请参阅上面的 ... 部分。
来源:https://git-scm.com/docs/git-push

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接