如何在git中强制合并?

35

我有一个项目,有开发分支和生产分支。最近我一直在开发分支上开发一批新的大型功能,因此我已经大约两周没有将开发分支合并到生产分支了。然而,在此期间,生产分支需要修复一些错误。

在大多数情况下,我能够在开发分支中进行修复,并将其"cherry-pick"到生产分支。但有时候,由于两个分支之间的修复存在较大差异,我需要手动修复生产分支。总之,自从分支分离以来,这两个分支已经发生了相当大的分歧。

现在我想将开发分支完全推送到生产分支。我不在意保留自分支分离以来在生产分支中的任何提交,我只想让生产分支看起来与开发分支完全一样。[EDIT:我想让生产分支与开发分支自分支分离以来完全一致,但不想重写分离前的历史记录] 但是,当我尝试进行合并时,会出现很多冲突,我不想手动修复。

如何强制合并git分支?我可以将生产分支的更改还原到分离点,然后只需快进到开发分支吗?

2个回答

29

你只需要将你的dev分支推送到主仓库的production分支即可:

git push --force upstream-remote dev:production

如果你使用的是默认克隆,则upstream-remote可能只是origin

针对修改后的问题进行更新:

在 Git 中,你可能不想执行 revert,但是,是的,你更多地想要做的就是这样。可以尝试执行以下操作:

git checkout -b merge <split hash>
git merge dev
git push --force origin merge:production

<split hash>是最后一个你想要保留的用于生产环境的提交。


嗯,实际上我想当我说我想要“生产看起来和开发完全一样”时,我说错了。我的意思是,我希望分支自从分离后看起来与开发完全一样。也就是说,我希望将自分离以来的所有开发提交应用于生产,而不关心生产提交。但是,我不想重写分离之前的历史记录,这听起来像是你的解决方案会做的事情。 - Sam Fen
1
两个分支在分裂时是相同的吗?听起来是这样的。如果是这样,那么它们在分裂之前具有相同的历史,因此您不会失去任何东西。 - smparkes
2
顺便提一下,就我个人而言,保留一个与“生产”不同的历史记录的“dev”分支有点反模式。最好在“生产”合并后放弃任何功能分支,并从新的“生产”头创建新的分支。 - smparkes
太好了,你的更新答案正是我所需要的。谢谢! - Sam Fen
非常好的答案。尝试了-X theirs等,但都没有起作用,仍然存在合并冲突。这个方法非常有效。 - braden
显示剩余2条评论

-4

这将把你的新分支合并到现有的基础分支中

git checkout <baseBranch> // checkout baseBranch
git merge -s ours <newBranch> // this will simply merge newBranch in baseBranch
git rm -rf . 
git checkout newBranch -- . 

读者应该注意,-s ours 会覆盖现有的工作,而 -X ours 则允许非冲突差异合并。-s ours 将使一个分支具有与另一个分支相同的状态,而 -X ours 不仅仅是简单地覆盖一个分支。我不是在纠正提出的答案,而是指出一个重要的细节。 - haleonj
这感觉像是一个值得挖掘的好答案。我自己已经使用了 git merge -s ours <oldBranch> 两次,它似乎正好做到了我想要的。与强制推送不同,它保留了版本历史记录。注意:我将 <oldBranch> 合并到新分支中,而不是相反。 - Josiah Yoder
我认为更好的形式是 git checkout <newBranch>; git merge -s ours <oldBranch>,然后从 newBranch 向 oldBranch 发起一个 pull request。这将用 newBranch 的当前内容替换 oldBranch 中的所有内容。它通过记录 oldBranch 合并到 newBranch 而不实际更改 newBranch 中的任何内容 来实现这一点。但由于 oldBranch 在合并历史中存在,因此从 newBranch 到 oldBranch 的 pull request 被视为快进合并。 - Josiah Yoder
那么 git rm -rf .git checkout newBranch -- . 都不需要了。 - Josiah Yoder
我知道有一种情况下 git merge -s ours <oldBranch> 会失败:那就是当 newBranch 直接从 oldBranch 派生出来时。(或者是反过来?)我认为某种快进方式可以解决这个问题,但我还没有时间测试这个理论。 - Josiah Yoder

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