git reset 和 git revert的区别

在 Git 中,git reset 和 git revert 是两个常见且功能强大的命令。它们都可以撤销更改,但适用场景和操作方式截然不同。

git reset

git reset 用于移动当前分支的 HEAD 指针,并可以选择性地更改工作区和暂存区的状态。它主要用于“回滚到某个版本”,从历史记录中移除不需要的提交。

  • 常用参数
    –soft:仅回滚到指定版本,保留暂存区和工作区的更改。
    –mixed(默认):回滚到指定版本,同时清空暂存区,但保留工作区更改。
    –hard:回滚到指定版本,并丢弃暂存区和工作区的更改。

提交历史如下

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

回滚到提交B

1
git reset --hard B

C 和 D 会被彻底删除,工作区将恢复到 B 的状态。现在的提交历史会变成如下。

1
A -> B (HEAD)

如果使用 –soft

1
git reset --soft B

C 和 D 的更改会保留在暂存区,待提交。

注意事项

  • 破坏性操作:–hard 会直接丢弃更改,如果没分支或tag保存,有数据丢失的风险,需谨慎使用。
  • 本地历史调整:git reset 不会生成新的提交,只会修改现有提交的状态,通常仅在本地分支中使用。

git revert

git revert 是一种更安全的撤销方法。它通过创建一个新的提交来反转指定提交的更改,而不会改变提交历史。这非常适合在协作开发中撤销错误操作。

提交历史如下

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

撤销提交C

1
git revert C

Git 会生成一个新的提交 E,其内容与 C 的更改相反,撤销提交 C 带来的修改。

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

提交 E = 提交 B 的内容 + 提交 C 的反向更改 + 提交 D 的更改

注意事项

  • 不可破坏性:git revert 不会修改历史记录,非常适合需要保留团队协作完整性的场景。
  • 可撤销性:如果你不小心 revert 了一个提交,还可以通过另一个 revert 恢复,git revert E

两者的主要区别

特性git resetgit revert
历史记录修改历史记录,移除指定提交保留历史记录,生成新的提交
适用场景本地修改,调整错误提交团队协作,安全撤销已推送的提交
破坏性可能丢失更改(尤其是 –hard)不会丢失任何更改
是否生成新提交不会生成新的提交会生成新的提交