完全还原拉取请求

时间:2016-09-30 16:04:24

标签: git github merge git-revert

目前master已在过去一个月内开展工作。此外,还有一个名为contract的分支同时处理。

错误地将

contract合并到master。 100个提交,日期重叠master提交已经存在的提交。

如何完全删除将contract的所有100次提交合并为master的提取请求?

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

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

如何彻底删除pull请求添加的任何提交,并且当我们最终将contract合并到master时仍然允许它们成功进入?

1 个答案:

答案 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。

相反,您可以重写历史记录。必须警告:对于使用您的存储库的其他开发人员来说,重写历史记录可能会造成危险并且具有破坏性。一定要清楚地告知你这样做。

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

如果除了CA以及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应显示所有预期的提交。