问题:分支具有良好的提交,与不需要的提交交错。
尝试解决方案:
git revert hash5 hash8 hash9 hash23
我认为这样做是因为它应用了所有指定的提交,然后让我解决任何冲突。
我现在认为会发生这种情况:
问题:在向我提出任何可能的冲突之前,如何让git连续应用所有恢复?
答案 0 :(得分:9)
首先,请注意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>~
在互动式rebase编辑器中,删除<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