目前master
已在过去一个月内开展工作。此外,还有一个名为contract
的分支同时处理。
contract
合并到master
。 100个提交,日期重叠master
提交已经存在的提交。
如何完全删除将contract
的所有100次提交合并为master
的提取请求?
我们在拉取请求中执行了GitHub还原,删除了代码但没有删除历史记录。现在,当我们尝试执行将contract
合并到master
的模拟拉取请求时,它表明没有任何更改。 (我假设因为那些提交已经进入但是还原了?)
除了恢复之外,合并后master
没有提交。
如何彻底删除pull请求添加的任何提交,并且当我们最终将contract
合并到master
时仍然允许它们成功进入?
答案 0 :(得分:3)
您的历史记录可能如下所示:
*--*--*--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
)。
如果除了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应显示所有预期的提交。