git checkout
针对修改后未 add 的提交。将当前 HEAD 指针指向指定的提交,也就是将该次提交的内容检出到工作区。
git reset
针对 add 和 commit 的提交。使 HEAD 节点指向之前的一次提交,该提交及之前的 commit 都会被保留,但是此 commit id 之后的修改都会被删除,会改变提交历史。生产建议慎用。
git revert
针对 commit 的提交。创建一个新的提交来撤销之前的一次提交,这次提交之前和之后的 commit 和 history 都会保留,不会改变提交历史。可以用于安全地撤销已发布的提交。
git reset
和 git revert
的区别
git reset
可以把暂存区的文件撤销回修改后的状态,即未 add 之前,git revert
不可以。
git revert
可以影响远程仓库,git reset
只能影响本地仓库。
git revert commit_id
是撤销 commit_id 这次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交;git revert commit_id
是撤销 commit_id 之后所有的操作。
git revert
会生成一个新的 commit 来回滚版本;git reset
则直接返回指定的版本号,该版本号之后的版本记录都会被删除。
git revert
是用一次逆向的 commit 中和之前的提交,因此日后合并老的 branch 时,导致这部分改变不会再次出现;git reset
是之间把某些 commit 在某个 branch 上删除,因而和老的 branch 再次 merge 时,这些被回滚的 commit 还会被引入。
git checkout
和git reset
通常用于本地或者私有分支的撤销操作。修改之后的提交历史,在推送到共享的远程仓库时会引发冲突。git revert
操作的"公共撤销"通常被认为是安全的。因为 revert 操作会为撤销动作创建一次提交,而这个撤销历史也会被其他人得到,并且 revert 操作也不会覆盖团队其他成员可能依赖的提交历史。
在团队合作的共同操作一个仓库的时候, git reset 命令一定要慎重使用,在使用的时候一定要再三确认其他同学的代码是否会被重置操作而导致代码丢失,导致一些提交记录的丢失,这些都是不可逆的,一定要慎重。