问题描述
我不小心将开发分支合并到主分支,我使用 github 还原了该更改,但更改已经应用于主分支,这并不意味着,并且开发分支似乎在多次提交时倒退。
我想要的是仅删除历史记录中的还原(图中箭头所示)并维护提交(框内),如下图所示。
请注意,评论是从最新到最旧(从上到下)排列的。 盒子里面是不小心取出的东西。
谢谢。
解决方法
- 可以尝试在红框的开头(旧侧/底部)重置分支,然后在红框(新侧/顶部)之后挑选剩余的顶部提交。
- 或者可以尝试在红色框的开头(旧侧/底部)重置分支,然后使用交互模式重新设置并跳过您不想要的提交并休息
记住git并不真正关心分支,它关心提交和它们的父项是很有用的。当我们说“这个分支上的所有提交”时,git 实际上看到的是“那个分支指向的提交,以及它的父级,以及它们的父级,回到历史的开始”。
当您将“branch-5”合并到“main”时,git 会查找“branch-5”历史记录中可访问但未在“main”中访问的所有更改。就 git 而言,这包括您在“开发”中所做的许多其他更改,但尚未在“主要”中。
当您要求恢复时,它恢复了所有这些更改,这正是您想要的 - main 现在应该具有与您出错前相同的 代码。
您确实遇到的问题是,所有这些提交现在都是“main”历史的一部分。这意味着当您确实想要合并它们时,git 会认为它们已经存在,并跳过它们。要解决此问题,您需要通过以下两种方式之一重写历史记录:
- 与其恢复提交,不如将“main”指向意外合并之前,假装它从未发生过。
- 重新设置所有意外合并的提交,以便使用新的提交哈希重新创建它们。
在这种情况下,选项 1 可能是可行的方法。它看起来像这样:
git switch main
git reset --hard last-commit-before-you-messed-up-main
git push --force-with-lease origin main
然后确保您没有任何结帐或分支具有“main”版本并意外合并。