You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

误合并PR后回滚导致无法新建PR的解决方案咨询

解决分支A无法创建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)之后,没有太多新的提交,这个方法最省事:

  1. 先拉取最新的main分支:
    git checkout main
    git pull origin main
    
  2. 切回分支A:
    git checkout A
    
  3. 把main的最新代码合并到分支A(避免冲突):
    git merge main
    
  4. 找到回滚提交的哈希值(可以在GitHub的PR#184页面或者本地用git log查看),然后撤销这个回滚提交:
    git revert <回滚提交的哈希值>
    
  5. 推送分支A到远程:
    git push origin A
    

现在再去GitHub开PR,就能看到分支A的变更了——这个操作相当于把之前的回滚给撤销了,恢复分支A的原始变更。

方法二:新建分支重新应用分支A的变更(更稳妥,适合main有大量新提交的情况)

如果main在回滚之后已经有很多新提交,用方法一可能会遇到复杂冲突,那就用这个方法:

  1. 拉取最新的main分支:
    git checkout main
    git pull origin main
    
  2. 基于最新的main创建一个新分支(比如叫A-reapply):
    git checkout -b A-reapply
    
  3. 把分支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
      
  4. 提交变更:
    git add .
    git commit -m "Reapply changes from branch A (originally PR #183)"
    
  5. 推送新分支到远程,然后基于这个新分支创建PR即可。

这两种方法都是安全的,不会改写公共分支的历史,完全符合Git协作的最佳实践。


内容的提问来源于stack exchange,提问作者Leonardo Alves Machado

火山引擎 最新活动