当前master
已在过去一个月进行了工作。同时还在开发一个名为contract
的分支。
contract
误合并为master
。100次提交,日期与已经存在的master
提交重叠。
如何完全删除合并contract
到master
的所有100个提交的拉取请求?
我们对pull请求进行了GitHub还原,删除了代码,但没有删除历史记录。现在,当我们尝试进行合并contract
到master
的模拟pull请求时,它显示没有变化。(我猜是因为那些提交已经进入但是被还原了?)
合并后master
上没有提交,除了恢复。
我怎么能完全删除任何提交添加的拉取请求,并仍然允许他们进入成功,当我们最终合并contract
到master
?
您的历史记录可能看起来像这样:
*--*--*--C---A--B [master]
/
*--*--*--*--* [contract]
其中A
是错误的合并,B
是恢复,C
是合并前最后一次正确的提交。(要确定您的情况下的哈希值,请执行例如git log --oneline --decorate
。)
当您恢复合并时,Git认为这意味着您不希望将这些更改重新合并到存储库中。如果您只是在命令行中工作,解决方案是恢复恢复,参见:在Git中重新执行恢复合并。但是,这会阻止你使用GitHub的PR UI。
相反,您可以重写历史记录。强制性警告:重写历史记录对于使用您的存储库的其他开发人员来说可能是危险和破坏性的。一定要清楚地表明你正在这么做。如果你还没有,切换到master
(git checkout master
)。
如果在C
之后除了A
, B
和contract
没有任何提交,那么执行:
git reset --hard HEAD~2
或:
git reset --hard C
那么你的历史记录将是这样的:
*--*--*--C [master]
*--*--*--*--* [contract]
如果在此期间有更多的提交,那么您将不得不重新定位。做的事:
git rebase -i X
在rebase-todo
文件中,删除与contract
分支对应的所有行,以及恢复提交B
。(在我的测试中,合并提交A
没有显示,但如果有,请删除它。)如果有任何冲突,修复它们并继续使用git rebase --continue
。
重写历史记录后,执行:
git push --force-with-lease origin master
您的master
分支现在没有合并发生的证据,contract
的PR应该显示所有预期的提交。