假设最后两个提交依次是:

  1. 最新的:merge branch(合并提交)
  2. 次新的:普通提交

使用 git revert 撤销时需要注意合并提交的特殊性:

操作步骤

1. 确认提交历史

git log --oneline -3

输出类似:

abc1234 (HEAD -> your-branch) Merge branch 'feature-xxx'
def5678 Some regular commit
ghi9012 Previous commit

2. 先撤销合并提交(最新的)

# 撤销合并提交,需要指定 mainline 父节点
git revert -m 1 abc1234 --no-edit

说明

  • -m 1:指定保留第一个父节点(通常是合并目标分支)
  • abc1234:替换为实际的合并提交哈希
  • --no-edit:使用默认的提交消息

3. 再撤销普通提交(次新的)

# 撤销普通提交
git revert def5678 --no-edit

4. 推送到远程

git push origin your-branch

详细解释

为什么需要 -m 选项?

合并提交有两个父节点:

  • 父节点1:合并目标分支(如 main/develop)
  • 父节点2:被合并的分支(如 feature-xxx)

-m 1 表示撤销合并时,保留父节点1的更改,撤销父节点2引入的更改。

验证撤销结果

# 查看撤销后的状态
git log --oneline -5

# 查看文件状态
git status

替代方案:一次性撤销

如果不想创建两个 revert 提交,可以一次性操作:

# 一次性撤销最后两个提交
git revert HEAD~1..HEAD --no-edit

# 但这样可能需要手动解决合并提交的冲突

注意事项

  1. 顺序重要:必须先撤销合并提交,再撤销普通提交
  2. 可能冲突:撤销合并提交时可能出现冲突,需要手动解决
  3. 团队协作:通知团队成员这些更改
  4. 备份建议:操作前可以创建备份分支
    git checkout -b backup-before-revert
    git checkout your-branch
    

完整示例

# 1. 查看提交历史
git log --oneline -3
# abc1234 Merge branch 'feature-xxx'
# def5678 Some regular commit
# ghi9012 Previous commit

# 2. 撤销合并提交
git revert -m 1 abc1234 --no-edit

# 3. 撤销普通提交  
git revert def5678 --no-edit

# 4. 推送更改
git push origin your-branch

这样操作后,会创建两个新的 revert 提交,分别撤销原来的两个提交的更改。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐