当前 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/