git revertgit reset --soft 都是用来“撤销”提交的命令,但它们的作用机制、影响范围和适用场景完全不同。

✅ 一句话区别

命令是否改变历史是否生成新提交适用场景
git revert❌ 不改变历史✅ 生成一个新提交(反向提交)公共分支,安全撤销
git reset --soft✅ 改变历史❌ 不生成新提交,只是移动 HEAD私有分支,彻底回退

🔍 详细对比

1. git revert <commit>

  • 原理:创建一个新的提交,这个提交的内容是目标提交的“反向操作”。
  • 效果:历史保留,只是“抵消”了某次提交的改动。
  • 示例:
git revert abc123

会生成一个新的提交,内容是撤销 abc123 的改动。

  • 适用场景:
    • 已经推送到远端的分支(如 main)。
    • 多人协作,避免重写历史。

2. git reset --soft <commit>

  • 原理:把 HEAD 指针 移动到指定提交,保留工作区和暂存区的改动。
  • 效果:看起来像是“回退”了,但改动还在暂存区,可以重新提交。
  • 示例:
git reset --soft abc123

之后的提交历史看起来像是 abc123 之后的提交都“消失”了。

  • 适用场景:
    • 本地分支,还没推送(或确定可以强推)。
    • 想重新整理提交历史(如拆分、合并提交)。

🎯 举个例子

假设提交历史如下:

A -> B -> C -> D (HEAD)

  • git revert CA -> B -> C -> D -> C' (C' 是撤销 C 的新提交)
  • git reset --soft BA -> B (HEAD) (C 和 D 从历史上“消失”,但改动还在暂存区)

✅ 总结口诀

  • revert = “安全撤销”,适合公共分支。
  • reset —soft = “回到过去重新来过”,适合本地整理提交。

❗注意

  • 如果你用了 reset --soft 回退了已经推送的提交,必须强推(git push --force),这会影响他人,慎用。
  • 在 Gerrit 或 GitHub PR 流程中,reset 后强推会导致 Review 页面混乱,建议用 revertcommit --amend 替代。

更新: 2025-08-08 09:55:38
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/dxfggmgyvqzapdcp


相关笔记