背景
所以,經常會遇到已經提交遠程倉庫,但是又不是我想要的版本,要撤下來。
回退版本一般使用git reset,又分為:
# 不刪除工作空間改動代碼,撤銷commit,不撤銷git add . git reset --soft xxx---版本號---xxxx # 刪除工作空間改動代碼,撤銷commit,撤銷git add . 注意完成這個操作后,就恢復到了上一次的commit狀態。 git reset --hard xxx---版本號---xxxx
兩種。
可以用git reset --soft HEAD~1(git reset --hard HEAD~1), 用來表示上一個版本,因為上一版本其實就是當前-1。git reset --soft HEAD~1 也可寫成 git reset --soft HEAD^ 。
也可以用git reset HEAD 表示當前版本,運行后並不會有什么變化,因為HEAD就是當前。
說這兩者區別前,我們首先要明白一個東西,commits。
它在git中扮演了一個重要角色,我們平常用的一些操作git clone ,git commit 都會產生commits,通俗的講這個就是版本號。
但是git reset並不會產生commits(不是不會產生,而是會產生 但是都是一樣的),我們可以先看看自己項目中的commits,使用如下命令:git reflog。
前面那一串數字就是commits。而git reset可以看成不產生commits,它只是改變了當前HEAD指向的commits。
git reset --soft 表示只是改變了HEAD的指向,本地代碼不會變化,我們使用git status依然可以看到,同時也可以git commit提交。
git reset --hard后者直接回改變本地源碼,不僅僅指向變化了,代碼也回到了那個版本時的代碼,所以使用是一定要小心,想清楚。
備注:
如果commit注釋寫錯了,只是想改一下注釋,只需要,git commit --amend,此時會進入默認vim編輯器,修改注釋完畢后保存就好了。
解決方案1
注意這個git reflog 列表是逆序排列的,最上面的最新的commit。
git reset --hard HEAD~1后,最后一個(HEAD->master),將一直往下走,並進一步接近
。
以上圖所示的狀態時,如果再來兩次 git reset --hard HEAD~1, 將回到初次提交后的狀態。
之后,使用git status ,可發現此時還在緩存區中的代碼,其含義是,第一次初始化提交后 ,進行了之后的add后新加入的文件 。
注意這種操作是本地的倉庫操作,如果你連續commit了很多次,而這些commit還沒有來得及提交遠程倉庫。此時如果想回到上次本地commit的話,也可以如上操作。再push,便可達到目的。
這時候就好辦了,我們選擇很多,可以直接修改代碼,再commit,也可以取消git add 命令, 如:
git rm -f --cached .idea/*
解決方案2 (推薦)
首先,通過git log
查看提交信息,以便獲取需要回退至的版本號。
然后,通過git reset –soft <版本號>重置至指定版本的提交,達到撤銷提交。
$ git reset --soft 85dee0d8b108c7450e0c820b2d72928f98d94f93
參數soft指的是:保留當前工作區,以便重新提交 。
還可以選擇參數hard,會撤銷相應工作區的修改,一定要謹慎使用。
通過git push origin master –force強制提交當前版本號,以達到撤銷倉庫遠程版本號的目的。
Cheetah@xxx MINGW64 /e/Projs/enft/data/cv_key_frame (master) $ git push origin master -f Total 0 (delta 0), reused 0 (delta 0) To github.com:AnthonyGIS/video_frame.git + c63650a...85dee0d master -> master (forced update) Cheetah@xxx MINGW64 /e/Projs/enft/data/cv_key_frame (master)
最后,修改代碼,重新提交和推送。
//修改代碼,添加修改 git add . //重新提交 git commit -m "xxx" //重新推送 git push origin master