对于代码的回退主要有 git reset 、git revert
1.git reset
- git reset commitId --soft:回退当前代码仓库到指定提交commitId,当前HEAD和commitId之间的修改会保留,这些修改会在暂存区。就是保留了add的状态
- git reset commitId --hard:回退当前代码仓库的代码到指定commitId,这之间的代码会丢失。
- git reset commitId --mixed:回退代码到commitId,修改保存在工作区,就是没有add的状态
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本,简单来说可以看到我们丢失的commitId。
2.git revert
- git revert commitId:撤销指定提交commitId。会建立一个新的commit,这个commit的内容就是指定commitId的反向,也就是提交一个新的commit把commitId对应的修改内容还原。
总结
图例说明
- reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除,包括提交历史记录;
- revert仅仅是撤销指定commit的修改,并不影响后续的commit,但所撤销的commit被后续的commit修改了同一地方则会产生冲突;
- reset执行后不会产生记录,revert执行后会产生记录;
- reset执行后无法再次恢复,revert执行后因为不会清除记录,并且会产生新纪录,所以文件不会丢失,你可以多次执行revert恢复到某次改变之前的状态;
- reset执行后HEAD会后移,而revert的HEAD则一直是向前的;