完全恢复拉取请求

Posted

技术标签:

【中文标题】完全恢复拉取请求【英文标题】:Reverting a pull request completely 【发布时间】:2017-02-09 06:40:17 【问题描述】:

当前master 已在过去一个月内工作。一个名为contract 的分支也在同时工作。

contract 被错误地合并到master 中。 100 次提交,日期与已存在的 master 提交重叠。

如何完全删除将所有 100 个提交从 contract 合并到 master 的拉取请求?

我们对拉取请求进行了 GitHub 还原,删除了代码但没有删除历史记录。现在,当我们尝试执行将 contract 合并到 master 的模拟拉取请求时,它显示没有任何更改。 (我假设是因为那些提交已经进入但被还原了?)

在合并后除了恢复之外,master 上没有任何提交。

我如何才能完全删除拉取请求添加的任何提交,并且在我们最终将 contract 合并到 master 时仍然允许它们成功进入?

【问题讨论】:

自还原后或合并与还原之间是否有任何其他提交? 在合并和还原之间没有提交。在合并和还原后只进行了 2 个提交,但是这两个提交都进入了合同而不是主控 【参考方案1】:

您的历史记录可能如下所示:

*--*--*--C---A--B [master]
 \          /
  *--*--*--*--* [contract]

A 是错误合并,B 是还原,C 是合并前的最后一次良好提交。 (要确定适合您情况的哈希值,例如git log --oneline --decorate。)

当您恢复合并时,Git 认为这意味着您永远不希望将这些更改重新合并到存储库中。如果您只是从命令行工作,解决方案是还原还原,请参阅:Re-doing a reverted merge in Git。但是,这会阻止您使用 GitHub 的 PR UI。

相反,您可以改写历史。强制性警告:重写历史记录可能对使用您的存储库的其他开发人员造成危险和破坏性。请务必清楚地表明您正在这样做。

如果您还没有,请切换到master (git checkout master)。

如果除了AB 以及来自contract 的任何提交之外,您在C 之后没有任何提交,则执行以下操作:

git reset --hard HEAD~2

或者:

git reset --hard C

那么您的历史记录将如下所示:

*--*--*--C [master]
 \          
  *--*--*--*--* [contract]

如果在此期间有更多提交,那么您将不得不改用 rebase。做:

git rebase -i X

rebase-todo 文件中,删除与contract 分支以及还原提交B 对应的所有行。 (在我的测试中,没有显示合并提交 A,但如果有,请删除它。)如果有任何冲突,请修复它们并继续使用 git rebase --continue

重写历史记录后,请执行以下操作:

git push --force-with-lease origin master

您的 master 分支现在将没有证据表明曾经发生过合并,来自 contract 的 PR 应该显示所有预期的提交。

【讨论】:

在我这样做之后,我仍然有 master 中的提交,contract 有(100 个左右)但我不再有 AB(合并请求或恢复)...我将请求contract 拉入master,它仍然显示没有任何变化。我想象如果这是一个壁球并合并它会恢复所有这 100 个提交 嗯,这很奇怪。是快进合并吗?如果两者之间没有好的提交,那么您只需将reset 往后一点。找到最后一个好的提交并执行git reset --hard <sha> 不幸的是,两者之间有很好的提交。这是通过 github 进行的标准合并。不确定他们使用哪种类型 @LearningJrDev 好的。我仍然对这是怎么发生的感到困惑,但我已经更新了我的地址以提供另一种解决方案。

以上是关于完全恢复拉取请求的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GIT 恢复旧的拉取请求

恢复了来自 github 的拉取请求,但两个分支没有区别

如何在 GitHub 上恢复拉取请求提交

Git在拉取请求分支上恢复樱桃选择而不在主控上恢复

给定版本的拉取请求的 Azure DevOps Web 视图

人工手动冷备不完全恢复介绍(purge表不完全恢复)