【问题标题】:How to roll back from a Git merge after multiple merges多次合并后如何从 Git 合并回滚
【发布时间】:2020-02-18 09:21:22
【问题描述】:

好的,所以我今天遇到了这种情况,我将另一个开发人员的一个分支合并到 master,他错误地将他的开发工作与他需要部署的更改一起合并到分支中。在我已经推送到远程(然后将其部署到一些生产服务器 - 它是在 uat 之后)之后,我尝试回滚合并,但因为我找不到共同的或初始的祖先而不能。

问题来了:

Dev 基于 master 创建一个新的分支,在工作和测试周期的过程中,定期将 master 合并到 dev 分支中,然后将分支推送到远程跟踪分支。大约 2 个月以来,每周都会发生这种情况。

与此同时,其他开发人员一直在将 master 合并到他们的分支中,然后将合并的分支合并回 master 以进行测试和部署。所以这个 devs 分支充满了他的工作提交以及 2 个月内所有其他 devs 提交的提交,即这个特定分支没有明确的祖先。

似乎不可能只回滚来自这个分支的更改,因为它已经在几个月的过程中例行地将 master 合并到它中(对于这个分支,项目总共是一年或 2 年)。我尝试了通常的方法来恢复合并和提交等。我无法重置,因为它已将 beeb 推送到原点。

有没有办法在这种情况下撤消合并?

【问题讨论】:

  • 您的问题没有简单的答案。您将必须确定您不希望出现的合并,然后将其还原,否则您将不得不重新设置历史记录,然后重新应用来自其他开发人员的合并。我认为无论你采用哪种方法都会有很多工作。
  • @LasseVågsætherKarlsen 在合并 master 后,开发人员每周都会推送到远程(加上一些)。所以我可以尝试单独恢复每个提交,然后虽然 master 定期合并到? (听起来工作量很大:D
  • 正如我所说,无论您选择哪种方法,您都会有很多工作要做。最好从历史的某个时间点建立一个新的、未受污染的分支,然后让开发人员为他正在实施的问题挑选他需要的提交。 IE。不要试图挽救现有的分支,而是尝试研究创建一个新分支需要什么。如果结果很难挑选,那么仅仅重新实现其中一些提交,甚至可能比修复现有提交更少的工作。

标签: git merge revert


【解决方案1】:

如果允许您在 master 上重写历史记录(例外),并且您还没有其他合并到 master,您可以考虑:

git checkout master
git reset --hard HEAD~
git push -f origin master

注意:这会重写 master 历史记录,因此您的所有开发人员都需要刷新 (git fetch) 并确保他们不会将这段旧代码合并回主代码。

注意:您可以将 HEAD~ 替换为错误合并之前的提交引用。然后将删除所有开始错误合并提交的提交。确保保留参考资料(分支,...),以免丢失该工作。

【讨论】:

  • 不幸的是,它已被推送到远程并被众多实体拉取,因此我无法重写历史记录。我在还原失败后做了git reset --hard HEAD^。有趣的是,如果我检查了几次提交,我最终得到了来自开发人员的所有更改(加上更多更改)并创建了一个分支。但是我无法将该分支合并回 master 或更新 master 以指向该分支,因为它已经合并了。差点搞定!
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2011-04-03
  • 2012-08-07
  • 1970-01-01
相关资源
最近更新 更多