在Git中,reset
和 revert
都是用来回到某个历史版本的工具,但它们的行为和适用场景有很大的不同。让我们通俗地讲解一下它们的异同:
1. Git reset(适用于提交未推送)
reset
用来撤销提交并将当前的状态回到指定的版本。它不仅影响 Git 历史记录,还会改变工作目录和暂存区的内容。
-
用途: 用于完全“重置”到某个提交,撤销之后的所有更改。
-
命令示例:
git reset --hard <commit_id>
--hard
表示工作目录、暂存区以及Git历史都会被修改,回到指定的提交。--soft
只改变Git历史,工作目录和暂存区保持不变,适用于想保留更改但撤销提交的情况。--mixed
默认方式,改变Git历史,工作目录不变,暂存区会重置。
默认重置head,当前版本,也可指定版本号
-
举个例子: 假设你提交了一些代码,但后面发现有错误。你想要完全丢掉这些提交并回到之前的版本。你可以用
git reset
将 Git 历史回到一个指定的提交。reset
会让那些提交在Git历史中消失,像是从未发生过。 -
适用场景:
- 本地开发阶段,当你想彻底撤销最近的几个提交。
- 如果你想保留一些更改,但不想把它们提交到Git历史中。
2. Git revert(适用于已推送,保证历史记录存在,避免结构式的破坏)
revert
的作用是生成一个新的提交,用来撤销之前某个提交的影响,而不会改变历史记录。它更像是做一个“撤销操作”,会保留之前的提交记录,但通过新的一次提交来反转代码的状态。
-
用途: 用来撤销某个提交的效果,但保持Git历史记录的完整性。
-
命令示例:
git revert <commit_id>
git revert
会创建一个新的提交,反向应用某个提交的变更。
-
举个例子: 假设你提交了一些代码,但发现其中有一部分是错误的,想要撤销。你不希望改变Git历史,只希望把这个错误的提交反向操作,这时可以使用
git revert
。这样做后,Git会记录一个新的提交,表示撤销之前的提交。 -
适用场景:
- 在公共的Git仓库中工作时,其他人可能已经拉取了你的提交,不可以改变历史。
- 需要撤销某个提交,但不希望丢失历史记录,尤其在团队协作中比较常见。
总结异同:
特性 | reset | revert |
---|---|---|
影响历史 | 会改变Git历史记录,删除指定提交后面的所有提交 | 保留Git历史,通过新提交来反向撤销指定的提交 |
影响工作目录 | 可以修改工作目录和暂存区内容 | 不修改工作目录和暂存区,仅生成一个新提交 |
适用场景 | 本地开发时的撤销,想要彻底回到某个版本 | 需要保持历史记录完整,撤销提交影响而不改变历史 |
使用场景
- 如果你在本地修改了代码并希望完全撤销之前的提交,可以使用
git reset
。 - 如果你在团队中协作,或者你希望保持历史记录完整,并且仅撤销某个提交的内容,那么应该使用
git revert
。