2016-09-30 75 views
3

当前master已在过去的一个月中进行过工作。同时还有一个名为contract的分支。完全恢复拉动请求

contract被错误合并为master。 100次提交,日期与master已有的提交重叠。

如何我可以完全删除合并从contract所有100个提交到master拉入请求?

我们做了一个GitHub的上拉请求恢复,并删除代码,但不是历史。现在,当我们尝试执行将contract合并到master的模拟拉取请求时,它显示没有更改。 (我认为是因为这些提交已经进入但已被还原?)

合并后还没有对master进行任何提交。

我怎样才能完全删除拉请求添加的任何提交,并仍然让他们成功进入我们最终合并contractmaster

+0

自恢复或合并与恢复之后是否还有其他任何提交? –

+1

没有提交合并,然后恢复。在合并和恢复后只有两个,但这两个提交合同都没有主 – LearningJrDev

回答

2

历史会是这个样子:

*--*--*--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)。

如果你没有从contractABC抛开之后的任何提交,任何提交,然后执行:

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公关应该显示所有预期的提交。

+1

我这样做后,我仍然有'master'提交'contract'有(100左右),但我不再有'A '或'B'(合并请求或回复)...我去请求'合同'到'master',它仍然显示没有变化。我想象如果这是一个壁球,并合并它会恢复所有这100个承诺 – LearningJrDev

+0

嗯,这很奇怪。它是一个快速合并?如果两者之间没有良好的承诺,那么你只需要稍微“稍微”复位就可以了。找到最后一个好的提交并执行'git reset --hard '。 –

+1

不幸的是,之间有很好的承诺。这是通过github进行的标准合并。不确定他们使用哪种类型 – LearningJrDev