可恶,代码提交错了该怎么办!revert和reset来帮忙

428 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第35天,点击查看活动详情

reset帮你重新提交

在代码协作的过程中,偶尔会遇到这样的情况:

image.png

忘了先同步代码git pull再进行提交,就会出现领先远程一个提交,同时又落后远程一个提交的情况:

image.png

比如图里这个就是当前分支领先了远程“编译参数修改”这个提交,又落后于“处理未实现的防抖问题”这个提交,当然一般这种情况下,在一些图形化工具(比如vscode的git插件)中,点击一下按钮即可完成同步,不过,这个原理是什么呢?

首先执行了git reset [远程提交哈希]命令,将HEAD重新指向最新的远程提交,并同时放弃这次领先的本地提交

image.png

那我的代码不会消失掉吗?答案是不会的,git reset这个命令接受三种参数:

  • --mixed 默认参数,会保留放弃提交的文件修改,但不会将其加入暂存区
  • --soft 会保留放弃提交的文件修改,并将其加入暂存区
  • --hard 会删除放弃提交的文件修改,慎用用完这个你的代码真的消失了

这个时候,本地和远端分支就实现同步了,这个时候,再将文件加入到暂存区,再次进行commit即可(或者你直接使用了--soft,那么直接commit操作就好了):

image.png

这时候就只有本地领先远端一个提交了,直接git push即可。

revert帮你反向提交

reset可以抹去某一次提交,那么,如果说我这次的提交还想记录下留着日后使用该怎么办呢,那git revert就派上用场了,我们首先做一次胡乱的提交:

image.png

image.png

这时候,运行git revert HEAD,当然这个HEAD也可以换成对应提交的哈希,我们看见:

image.png

image.png

多了一条提交,而提交的内容正好就是被revert的那次提交相反的代码,也就实现了将代码恢复回来并将被恢复掉的更改保存下来的效果。