github revert 多个 PR的步骤

github revert 多个 PR 的正确步骤

在 GitHub 上 revert 多个 PR 时,正确的步骤和注意事项如下:

1. revert 的顺序原则

反向顺序 revert:从最新的 PR 开始,逐步回退到最早的

# 假设有 3 个 PR:PR1 → PR2 → PR3
# 正确的 revert 顺序:PR3 → PR2 → PR1

2. 基本步骤

方法一:逐个 revert(推荐)

# 1. 确保在正确的分支上
git checkout main  # 或你的目标分支
git pull origin main

# 2. 获取需要 revert 的 PR 对应的 commit hash
# 可以通过 GitHub UI 或 git log --oneline --graph

# 3. 按反向顺序 revert
git revert -m 1 <PR3_merge_commit>
git revert -m 1 <PR2_merge_commit>
git revert -m 1 <PR1_merge_commit>

# 4. 推送到远程
git push origin main

方法二:批量 revert 后一次性提交

# 1. 创建临时分支
git checkout -b revert-multiple-prs

# 2. 逐个 revert,但暂不提交
git revert -n -m 1 <PR3_merge_commit>
git revert -n -m 1 <PR2_merge_commit>
git revert -m 1 <PR1_merge_commit>

# 3. 一次性提交所有更改
git commit -m "Revert multiple PRs: PR1, PR2, PR3"

# 4. 推送并创建 PR
git push origin revert-multiple-prs
# 然后在 GitHub 上创建 PR

3. 处理冲突

当出现冲突时:

# 1. revert 时遇到冲突
git revert -m 1 <commit_hash>
# 自动暂停并提示冲突

# 2. 解决冲突
# 手动编辑冲突文件,或使用工具
git mergetool

# 3. 标记冲突已解决
git add <resolved_files>

# 4. 继续 revert 过程
git revert --continue

# 5. 如果想放弃当前 revert
git revert --abort

4. 最佳实践

✅ 推荐做法:

  • 先在本地测试:在测试分支上先尝试 revert
  • 小批量操作:一次不要 revert 太多 PR
  • 创建 revert PR:通过 PR 审查后再合并
  • 详细提交信息:说明为什么要 revert 以及 revert 了哪些内容

❌ 避免做法:

  • 不要直接在主分支上强制 push
  • 不要一次性 revert 太多 PR(容易出错)
  • 不要在冲突未解决时强制继续

5. 实用脚本

#!/bin/bash
# revert-multiple.sh

BRANCH="main"
PR_COMMITS=("$@")

# 反转数组(反向顺序)
REVERSED_COMMITS=()
for ((i=${#PR_COMMITS[@]}-1; i>=0; i--)); do
    REVERSED_COMMITS+=("${PR_COMMITS[i]}")
done

git checkout $BRANCH
git pull origin $BRANCH

for commit in "${REVERSED_COMMITS[@]}"; do
    echo "Reverting $commit..."
    if ! git revert -m 1 $commit; then
        echo "Conflict detected! Please resolve conflicts and run:"
        echo "  git revert --continue"
        echo "Or to abort:"
        echo "  git revert --abort"
        exit 1
    fi
done

git push origin $BRANCH

使用方法:

./revert-multiple.sh abc123 def456 ghi789

6. 特殊情况处理

如果 PR 有依赖关系:

  • 先分析 PR 之间的依赖
  • 按依赖关系的反向顺序 revert
  • 可能需要同时 revert 相关的多个 PR

如果 revert 后代码无法编译:

  • 考虑是否需要部分 revert
  • 或者先修复问题再继续 revert

记住:谨慎操作,充分测试,保持沟通是处理多个 PR revert 的关键!