轉自https://www.cnblogs.com/lwh-note/p/9639835.html
兩種情況(場景)
情況一
代碼還只在本地,未push到運程倉庫,想把代碼還原到上一次commit的代碼,此時操作為代碼撤銷
解決方案
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
情況二
代碼已經push到運程倉庫,想把代碼還原到上一次提交,此時操作為代碼回滾
解決方案:
1)先查看git提交日志,找到上次提交的信息,輸入命令 git log (查看全部日志)或 git log -xx(查看最近xx條日志)
$ git log -3 commit 4dc08bb8996a6ee02f Author: Mark <xxx@xx.com> Date: Wed Sep 7 08:08:53 2016 +0800 xxxxx commit 9cac9ba76574da2167 Author: xxx<xx@qq.com> Date: Tue Sep 6 22:18:59 2016 +0800 improved the requst commit e377f60e28c8b84158 Author: xxx<xxx@qq.com> Date: Tue Sep 6 14:42:44 2016 +0800 changed the password from empty to max123
可以看到,我標紅的就是commit的ID標識,所以為了更好區分你每次代碼提交標識,建議每次提交時給到Tag(提交信息)。
2)回滾到指定的版本(hard后面接的是上面標紅的ID,也就是想回滾到的版本)
git reset --hard e377f60e28c8b84158 ## 回退到指定版本,不保留原更改代碼 git revert e377f60e28c8b84158 ## 回退到指定版本,保留原更改代碼,且生成新的提交
3)強制提交(這個時候已經將代碼回退了,你現在的分支狀態就處於你上一步指向的版本)
git push -f origin master
4)如果你只是誤提了代碼,想保留代碼改動的話,那就在2)的時候使用revert 命令,而不是reset,兩者區別如下:
- revert 是放棄指定提交的修改,但是會生成一次新的提交,需要填寫提交注釋,以前的歷史記錄都在;
- reset是指將HEAD指針指到指定提交,歷史記錄中不會出現放棄的提交記錄。
關於對Git中reset詳解,可以參考:https://www.jianshu.com/p/12803dba313e
情況三
問題:you are not allowed to push code to protected branches on this project
解決辦法:取消master分支的保護狀態
gitlab——》settings——》branchs——》unprotected