reset和revert都可以用来回滚代码。但他们是有区别的,准确来说,reset是用来"回退"版本,而revert是用来"还原"某次或者某几次提交。
听起来有点绕,怎么去理解他们呢?
比如在master分支,有以下提交历史:
Administrator@MS-OXKAVLTCDZIR MINGW64 ~/Desktop/repo (master)
$ git log --oneline
4a3c9fa (HEAD -> master, origin/master, dev) 第五次提交
7468c56 第四次提交
a1d6ef4 第三次提交
40d6a74 (origin/dev) 第二次提交
b6a242f 第一次提交
可以看到,master最新版本为第五次修改。
如果发现,在第四次修改有错误,需要回滚到第三次修改,就可以用reset命令来回退。
执行 git reset --hard a1d6ef4,这个时候,git的提交历史变为:
$ git log --oneline
a1d6ef4 (HEAD -> master) 第三次提交
40d6a74 (origin/dev) 第二次提交
b6a242f 第一次提交
可以看到master当前指向a1d6ef4这个版本,我们回到了第三次修改。
使用reset命令,Git会把要回退版本之后提交的修改都删除掉。
Lin@L-Cheng MINGW64 ~/Desktop/jack (master)
$ git log --oneline
f94b796 (HEAD -> master) 第五次提交
b765f45 第四次提交
0c401e1 第三次提交
9541002 第二次提交
4a7a07a 第一次提交
看上面代码发现第三次修改有错误,想要恢复第三次修改,却要保留第四次、第五次修改呢?
这个时候就可以用revert命令:
git revert -n 0c401e1
然后解决冲突--》add-》 commit "恢复第三次提交"
实际上,Git把第三次修改从提交中剔除(还原)了,还保留了第四次、第五次修改,并且产生了新的commit_id。
在实际生产环境中,代码是基于master分支发布到线上的,会有多人进行提交。可能会碰到自己或团队其他成员开发的某个功能在上线之后有Bug,需要及时做代码回滚的操作。
在确认要回滚的版本之后,如果别人没有最新提交,那么就可以直接用reset命令进行版本回退,否则,就可以考虑使用revert命令进行还原修改,不能影响到别人的提交。
使用reset还是revert,需要考虑实际的适用场景,没有绝对化。