完整性检查
首先,请注意,它git revert会按照您列出其哈希值的顺序恢复您的补丁程序;您需要从最新到最旧列出哈希,因为您想及时倒退。所以,我要调用你的哈希值
<hash1> ... <hashN>
哪里<hash1>比<hash2>... 更老 比<hashN>. 所以,确保你在做
git revert <hashN> ... <hash1>
首先!
简单的解决方案
其次,假设您以正确的顺序还原它们,请尝试以下--no-commit选项:
git revert --no-commit <hashN> ... <hash1>
更多涉及的解决方案
第三,如果简单的解决方案效果不佳,但是您想要恢复的提交确实作为单个提交有意义(如果不是,我看不到太多希望),那么试试这个:构建一个大提交四个要还原,然后还原大提交。
构建大提交:
在最旧提交的父级创建一个分支:
git checkout -b big-commit <hash1>~
复制新分支上的提交并折叠它们:
git cherry-pick --no-commit <hash1> ... <hashN>
git commit -m "Big commit"
您现在应该在您的分支上有一个大提交big-commit。
将大提交反向应用到您要恢复的分支:
git checkout <branch you wanted to revert on>
git revert big-commit
另一个相对简单的解决方案
使用选择性变基来重建有问题的分支,就好像它从未包含不需要的提交一样:
创建一个新的rebuild分支来工作:
git checkout -b rebuild <branch you want to revert>
交互式地变基,删除你不想要的提交:
git rebase -i <hash1>~
在交互式变基编辑器中,删除<hash1>...的行<hashN>。
现在您的rebuild分支将包含<branch you want to revert>,就好像<hash1>...<hashN>从未存在过。如果您在这里遇到冲突,似乎它们是不可避免的。
如果你需要你的工作<branch you want to revert>,你不能只是git reset指向你的新rebuild分支:
git checkout <branch you want to revert>
git reset --hard rebuild
(例如,因为您已经公开推送了它),那么您可以将差异应用<branch you want to revert>为补丁:
git co <branch you want to revert>
git diff <branch you want to revert> rebuild | patch