大家有没有这种情况,有时候写了代码,git add -A;git commit -m "feat:new func";git push;一阵行云流水的操作之后,又发现又有些要略微修改,甚至经过了好几次操作,但是此时已经做过多次提交,且推送到远程分支,这时我们希望能有如下操作:撤销之前无效的commit,但是保留代码,修改代码,重新推送远程分支。

1.查看日志

git log

拿到commitid

2.撤销且保留代码

git reset --soft <commitid>
git reset --soft HEAD~2 #撤销临近的2次提交

git reset 命令分为两种:

  • git reset –-soft :只是改变了HEAD的指向,本地代码不会变化
  • git reset –-hard:直接改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码

3.推送

关键点来了,此时本地与远程已经不同。一般对权限没有限制的分支可以强推:

git push origin branch --force

但是如果是保护分支,就会有如下提示:

remote: GitLab: You are not allowed to force push code to a protected branch on this project.

这时就需要去gitlab上去暂时关闭保护(Unprotect):

image-20220216150644640

然后再强制推送,别忘了再添加保护分支。但是这种操作是非常不规范的,一般保护分支不会这样轻易改变权限,且也不会允许强制推送。这也给我提了个醒:

代码不要轻易push,一定要在测试完备,确认无误后才进行push!

4.扩展

这里归纳利用git,进行commit或者push的不成文原则:

  • 一个commit最好能够包含一个完整的功能或者子功能,粒度由开发者掌握
  • 在没有完全无误之前,如果是保护分支,不要push
  • 在没有push之前,新提交与最后一次提交存在关联,使用 --amend参数提交,这样为后续排查代码问题提供了便利:一个commit包含了所有相关的代码变动,如果已经push,那只能强制提交