记一次自己手残提交了很多还没写完的代码到线上,然后第一次回滚代码…

本地回滚代码我已经是经常干了,我习惯用

git reset --soft HEAD^
// 撤销本地最近的一个 commit,会改变代码

git reset --hard HEAD^
// 改变 commit HEAD 指向,代码不改变

其实这里的 HEAD^ 是指上一个 commit id,这里也可以用 commit id 代替。

Git 后悔药,怎么撤销已经 push 上去的 commit ?-天真的小窝

执行 git log 就能看到了,不想输入这么长的话,输入前面开头 7 位也是可以的。

这是没有 push 到线上的,那么已经 push 上去该怎么破呢?

git reset –soft HEAD~1
# 回滚一个 commit,也可以用 git reset --soft HEAD^

git push origin master --force
# 强制 push 到 origin 的 master 分支上,也就是强制 push 到线上

没错,就是这么简单一般来说到这里就成功了。不过我们仓库是基于 GitLab 搭建的私有仓库,于是我这边踩到一个小坑,push 的时候报错了

$ git push origin master --force

remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To test.zmide.cn:demo/test.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: Push some references to 'test.zmide.cn:demo/test.git' Fail

它说不允许你将代码强制推送到此项目上受保护的分支,需要到私有仓库的 web 端设置一下,具体操作如下:

Git 后悔药,怎么撤销已经 push 上去的 commit ?-天真的小窝
Git 后悔药,怎么撤销已经 push 上去的 commit ?-天真的小窝

将你想要回滚代码的分支取消一下保护就好了。