误合并PR后回滚导致无法新建PR的解决方案咨询
首先得搞清楚你遇到的问题根源:GitHub的回滚按钮生成的是一个反向提交(也就是revert commit),它把分支A的所有变更都撤销了,但分支A的原始提交依然留在main的历史记录里。所以当你尝试用分支A开PR时,GitHub对比分支历史,发现分支A的所有提交都已经存在于main中——它不管这些提交被后续的回滚抵消了,只认历史存在性,自然就提示"There isn’t anything to compare"。
接下来分析你提到的两种方案:
关于reset HEAD操作
除非你的main分支是只有你一个人使用的私有分支,否则绝对不要用这个方法!reset会直接改写main的历史记录,如果有其他协作者在基于main开发,他们拉取代码时会遇到严重的冲突,整个团队的代码都会乱掉,这是Git协作中的大忌。如果是私有分支,reset到PR183合并前的状态再重新合并分支A是可行的,但公共分支完全不推荐。
关于直接rebase分支A
这个方法没用。因为Git在rebase时会自动检测分支A的提交是否已经存在于main的历史中,发现存在后会直接跳过这些提交,分支A不会有任何变化,自然还是无法创建PR。
正确的解决方案
推荐两种安全且有效的方法,你可以根据实际情况选择:
方法一:在分支A上撤销回滚提交(简单直接)
如果main分支在合并回滚PR(#184)之后,没有太多新的提交,这个方法最省事:
- 先拉取最新的main分支:
git checkout main git pull origin main - 切回分支A:
git checkout A - 把main的最新代码合并到分支A(避免冲突):
git merge main - 找到回滚提交的哈希值(可以在GitHub的PR#184页面或者本地用
git log查看),然后撤销这个回滚提交:git revert <回滚提交的哈希值> - 推送分支A到远程:
git push origin A
现在再去GitHub开PR,就能看到分支A的变更了——这个操作相当于把之前的回滚给撤销了,恢复分支A的原始变更。
方法二:新建分支重新应用分支A的变更(更稳妥,适合main有大量新提交的情况)
如果main在回滚之后已经有很多新提交,用方法一可能会遇到复杂冲突,那就用这个方法:
- 拉取最新的main分支:
git checkout main git pull origin main - 基于最新的main创建一个新分支(比如叫
A-reapply):git checkout -b A-reapply - 把分支A的变更应用到新分支上,这里有两种方式:
- 方式一:生成补丁并应用(适合分支A变更不多的情况):
git diff main..A > A-changes.patch git apply A-changes.patch - 方式二:cherry-pick分支A的所有提交(适合分支A有多个独立提交的情况):
先找到分支A最初从main分出来的那个提交哈希值(比如叫initial-commit),然后执行:git cherry-pick initial-commit..A
- 方式一:生成补丁并应用(适合分支A变更不多的情况):
- 提交变更:
git add . git commit -m "Reapply changes from branch A (originally PR #183)" - 推送新分支到远程,然后基于这个新分支创建PR即可。
这两种方法都是安全的,不会改写公共分支的历史,完全符合Git协作的最佳实践。
内容的提问来源于stack exchange,提问作者Leonardo Alves Machado




