用法
git reset
用于回退版本,可以指定退回某一次提交的版本。直接删除指定的 commit 之后的记录。
命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
--mixed 为默认,可以不用带该参数,不删除工作空间改动代码,撤销 commit,并且撤销 git add --soft 不删除工作空间改动代码,撤销 commit,不撤销 git add --hard 删除工作空间改动代码,撤销 commit,撤销 git add
git revert
用于重做(回滚)指定某一次提交的版本。不会删除 commit 和 history ,且会把这次操作作为一次最新的提交。
命令语法格式如下:
git revert [<options>] <commit-ish>
区别
git revert 是用一次新的 commit 来回滚(重做)之前的 commit ,git reset 是直接删除指定的 commit。- 在回滚操作上看,效果差不多。但是在以后继续合并以前的老版本时有区别。
git revert 是用一次逆向的 commit (重做)之前的提交,因此以后合并老的分支时,会导致这部分改变不会再次出现,但是 git reset 是直接把某些 commit 在某个分支上删除,因而和老的分支再次合并时,这些被回滚的 commit 还会被引入。
场景
- 小明在分支 dev1 上开发,提交了 3 次(分别为 c1、c2、c3),发布时需要把 dev1 分支合并到 master 分支上,生成记录 m2,并发布到线上。
- 小王在分支 dev2 上开发,提交了 1 次(c1),然后也把 dev2 分支合并到 master 分支上,生成记录m3,并发布到线上。
- 不幸的是,小名的 dev1 分支上存在 bug,需要回滚 dev1 上的所有提交。
解决
使用 git reset 会将 M1 之后的提交都回退掉, 也就是 M2 和 M3 都会消失,这不符合现在的场景, 所有推荐使用 git revert . git revert 会生成 M4,M4 上面就没有 dev1 的提交了。 注意: 当 dev1 分支的 bug 修改完成后,在合并到 master 时,之前被重做的内容是不会出现的,也就是 C1、C2、C3 的改变不会再出现,需要再次 revert 掉 M4,生成 M5 后再进行合并。
|