git revert
和 git reset
都是用于撤销更改的 Git 命令,但它们的工作方式和用途有显著不同。以下是这两个命令的详细区别:
git revert
- 目的:
- 用于撤销特定的提交,并生成一个新的提交来记录该撤销操作。
- 不会改变提交历史,因此对协作开发更加安全。
- 工作方式:
- 创建一个新的提交,其内容是反向应用指定提交的更改。
- 保持提交历史的完整性,适合在共享分支(如
main
或master
)上使用。
- 用法:
git revert <commit-hash>
- 示例:
假设有如下提交历史:
commit C (HEAD)
commit B
commit A
运行 git revert B
后,提交历史将变成:
commit D (HEAD) # This is the revert commit
commit C
commit B
commit A
git reset
- 目的:
- 用于将当前分支指针移动到指定提交,并可选择性地更改工作目录和暂存区的内容。
- 适用于撤销提交、修改提交历史、或清理工作目录和暂存区。
- 工作方式:
- 根据使用的选项,可以重置分支指针、暂存区或工作目录。
- 可以删除提交,适合在个人分支或还未推送的分支上使用。
- 用法和选项:
git reset --soft <commit-hash>
:重置分支指针到指定提交,保留工作目录和暂存区的更改。git reset --mixed <commit-hash>
(默认选项):重置分支指针到指定提交,保留工作目录更改,但清空暂存区。git reset --hard <commit-hash>
:重置分支指针到指定提交,同时清空工作目录和暂存区的更改。
- 示例:
假设有如下提交历史:
commit C (HEAD)
commit B
commit A
运行 git reset --hard B
后,提交历史和工作目录将变成:
commit B (HEAD)
commit A
比较
- 提交历史:
git revert
保留所有提交历史,包括被撤销的提交和新的撤销提交。git reset
可以删除或修改提交历史(视选项而定),对于协作开发有风险,可能导致其他开发者的仓库出现问题。- 用例:
git revert
:适用于撤销公共分支上的提交,不会影响其他开发者。git reset
:适用于个人分支上的更改,可以彻底删除不需要的提交或更改提交历史。- 安全性:
git revert
安全性更高,因为它保留了完整的历史记录。git reset
需要谨慎使用,尤其在公共分支上,否则可能导致提交历史不一致。
总结
- 使用
git revert
来安全地撤销提交,并保持提交历史的完整性,适合在公共分支上使用。 - 使用
git reset
来修改或删除提交历史,适合在个人分支或未推送的分支上使用,需要谨慎操作。