一、git commit撤回
此时代码只是commit到了本地,还没有push到远程仓库,撤销方式如下
git reset --soft HEAD^
个人理解此命令的意思是撤销到上一个版本 HEAD^
git reset --soft HEAD~1
个人理解此命令的意思也是是撤销到上一个版本 HEAD~1
,但是如果写成HEAD~2
就是撤销上两个版本。比第一种灵活一点。
其次要注意:
::: warning
两个命令仅仅是撤回commit操作,你写的代码依然保留,你可以修改后再次commit提交。
:::
剩余几个参数:
--mixed
意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
--soft
不删除工作空间改动代码,撤销commit,不撤销git add .
--hard
删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。
顺便说一下,如果commit注释写错了,只是想改一下注释,只需要:
git commit --amend
此时会进入默认vim编辑器,修改注释完毕后保存就好了。
参考博客园
二、git push撤回
此时代码已经push到远程仓库了,如果想撤销也是可以的。
::: warning
首先确认你要修改的分支不是被保护的,或者你的权限足够大,否则一通操作后发现没用!!!
:::
正式开始,咱们使用的有两个命令
git reset --hard
git reset --soft
前者表示只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交。
后者直接回改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码,所以使用是一定要小心,想清楚。
然后再来看回退,如果只是回退到上个版本可以使用
git reset --soft xx版本号xxx
git reset --hard xx版本号xxx
也可以使用
git reset --soft HEAD~1
git reset --hard HEAD~1
当执行完上面的命令后,我们就可以做很多操作,比如撤销git add命令:
git rm --cached
至于这个命令可以参考GIT代码在GIT ADD之后如何取消
经过上面操作后,我们本地的代码已经达到我们想要的结果了,这时我们可以进行git commit
后,再使用git push origin 分支名
就可以将新的代码覆盖掉远程仓库版本代码,
这样子就达到了撤销远程仓库代码一样的效果,但是这时我们可能会报错,因为本地的代码版本低于远程分支的版本,所以要想覆盖掉它,必须使用force
git push origin 分支 --force
但是,如果push的分支是被保护的,我们还是强制推不上的!!!
参考CSDN