git - 完全还原 pull 请求

标签 git github merge git-revert

当前 master 在过去的一个月里一直在工作。同时还开发了一个名为 contract 的分支。

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

如何完全删除将所有 100 个提交从 contract merge 到 master 中的 pull 请求?

我们对 pull 请求进行了 GitHub 恢复,删除了代码但没有删除历史记录。现在,当我们尝试将 contract merge 到 master 中时,它显示没有任何变化。 (我假设是因为这些提交已经提交但被还原了?)

除了还原之外, merge 后 master 上没有任何提交。

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

最佳答案

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

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

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

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

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

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

如果在 C 之后没有任何提交除了A , B ,以及来自 contract 的任何提交,然后做:

git reset --hard HEAD~2

或者:

git reset --hard C

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

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

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

git rebase -i X

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

完成重写历史后,执行:

git push --force-with-lease origin master

你的 master branch 现在没有 merge 发生过的证据,来自 contract 的 PR应该显示所有预期的提交。

关于git - 完全还原 pull 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39795688/

相关文章:

github - 我可以在与 GitHub 兼容的 Markdown 中对长列进行自动换行吗?

python - 使用 Pandas Python 进行透视以获取 bool 值

python - 结构错误 : Fatal error: local() encountered an error (return code 2) while executing 'git commit -m ' message'

git - 如何以只读方式与合作者共享私有(private) GitHub 存储库中的一个分支?

git - TeamCity 到 GitHub 连接错误 : session is down

git - 有没有一种简单的方法可以修复 github 存储库中的缩进样式错误?

配置文件等的 Git 最佳实践

git - 无法 merge origin/master : error: Your local changes to the following files would be overwritten by merge

git: merge 两个分支并提前提交

c++ - C++ 中涉及 new 和 delete[] 函数的奇怪错误