完整性检查
首先,请注意,它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