git reset与git revert都是常见的回滚代码的操作,那么它们有何不同呢?
本文将通过一系列步骤来研究reset与revert并分析二者区别,
所有操作均在main分支进行。
步骤一:初始化提交
初始化git仓库 -> 提交A -> 提交B -> 提交C
得到结果:
步骤二:reset
将提交回滚到A
git reset 306e695 --hard
关于--hard
参数的讨论放在文后
得到结果:
此时代码已经回滚到A,并且删除了B和C两个提交记录
步骤三:撤销回滚
重新来过,将代码回滚到C,为了演示revert
git reset 95fdfd5 --hard
得到结果:
此时最新提交回到了C
步骤四:revert
将代码回滚到A
git revert 306e695
冲突产生了!!!
解决冲突后产生新的提交D
得到结果:
此时最新提交走到了D,代码回滚到了A
结论
git reset
命令通常用于撤销上一次提交,回退到之前的版本,该命令会改变 Git 的历史记录。git revert
命令会产生新的提交,并保留之前的提交历史记录。git reset
通常在本地提交还未推送到远端仓库时使用,不产生新的提交,但会永久删除提交,有破坏性更新。git revert
通常用于回滚包含远端仓库的提交,保留了历史提交记录,方便定位问题,比较安全。
补充
--soft
:仅重置 HEAD,保留所有文件更改在暂存区。--mixed
:默认,重置 HEAD 和暂存区,保留文件更改在工作目录。--hard
:重置 HEAD、暂存区和工作目录,完全丢弃本地更改。- 撤销
git revert commitID
的方法:git revert --abort
。