【Git】git操作常用场景(四)——撤销提交
大家有没有这种情况,有时候写了代码,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):
然后再强制推送,别忘了再添加保护分支。但是这种操作是非常不规范的,一般保护分支不会这样轻易改变权限,且也不会允许强制推送。这也给我提了个醒:
代码不要轻易push,一定要在测试完备,确认无误后才进行push!
4.扩展
这里归纳利用git,进行commit或者push的不成文原则:
- 一个commit最好能够包含一个完整的功能或者子功能,粒度由开发者掌握
- 在没有完全无误之前,如果是保护分支,不要push
- 在没有push之前,新提交与最后一次提交存在关联,使用
--amend
参数提交,这样为后续排查代码问题提供了便利:一个commit包含了所有相关的代码变动,如果已经push,那只能强制提交
- 原文作者:Garfield
- 原文链接:http://www.randyfield.cn/post/2022-02-16-git-reset/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。