1.寫(xiě)在前面
我們?cè)谑褂肎it進(jìn)行版本控制時(shí),有可能會(huì)出現(xiàn)這種情況。git push后發(fā)現(xiàn)提交的內(nèi)容不是想要的,這時(shí)候我們?cè)趺醋瞿兀峤簧先サ膬?nèi)容是沒(méi)有刪除按鈕的(比如github,或碼云)。所以我們需要一些手段將提交上去內(nèi)容撤銷(xiāo)下來(lái)。
2.解決
首先將本地的內(nèi)容回退到自己想要的版本?;赝税姹疚乙话闶褂?/p>
git reset
其中這條命令中又分為兩種
git reset –hard
git reset –soft
注意上者的區(qū)別,在說(shuō)這兩者區(qū)別前,我們首先要明白一個(gè)東西,commits,它在git中扮演了一個(gè)重要角色,我們平常用的一些操作git clone ,git commit 都會(huì)產(chǎn)生commits,通俗的講這個(gè)就是版本號(hào),但是git reset并不會(huì)產(chǎn)生commits(不是不會(huì)產(chǎn)生,而是會(huì)產(chǎn)生 但是都是一樣的),我們可以先看看自己項(xiàng)目中的commits,使用如下命令
git reflog
看到?jīng)]前面那一串?dāng)?shù)字就是commits,所以git reset可以看成不產(chǎn)生commits,它只是改變了當(dāng)前HEAD指向的commits。
- git reset –soft
- git reset –hard
前者表示只是改變了HEAD的指向,本地代碼不會(huì)變化,我們使用git status依然可以看到,同時(shí)也可以git commit提交。后者直接回改變本地源碼,不僅僅指向變化了,代碼也回到了那個(gè)版本時(shí)的代碼,所以使用是一定要小心,想清楚。
然后再來(lái)看回退,如果只是回退到上個(gè)版本可以使用
git reset –soft xx版本號(hào)xxxx
git reset –hard xx版本號(hào)xxx
也可以使用
git reset –soft HEAD~1
git reset –hard HEAD~1
因?yàn)榍懊嬲f(shuō)了HEAD就代表當(dāng)前,所以上一個(gè)版本其實(shí)就是當(dāng)前-1,我們也可以用
git reset HEAD
試一試,并不會(huì)有什么變化,因?yàn)镠EAD就是當(dāng)前。這里我們先使用
git reset –soft HEAD~1
我們可以知道其實(shí)HEAD已經(jīng)指向上一個(gè)commits了,我們可以是用git reflog驗(yàn)證下
我們?cè)偈褂胓it status看看,發(fā)現(xiàn)沒(méi),代碼還在緩存區(qū)中
這時(shí)候就好辦了,我們選擇很多,可以直接修改代碼,再commit,也可以取消git add 命令,指令如下
git rm –cached xxx文件名xxx
git rm
至于這兩者的區(qū)別看這里吧[GIT]代碼在GIT ADD之后如何取消
ok 到現(xiàn)在為止,本地的版本已經(jīng)達(dá)到我們想要的了,現(xiàn)在只需要改變遠(yuǎn)程倉(cāng)庫(kù)的版本了,對(duì)的,我們只需要在git commit 后,再使用 git push origin 分支名 就可以將新的代碼覆蓋掉遠(yuǎn)程倉(cāng)庫(kù)版本代碼,這樣子就達(dá)到了撤銷(xiāo)遠(yuǎn)程倉(cāng)庫(kù)代碼一樣的效果,但是這里有點(diǎn)點(diǎn)問(wèn)題,先接著看吧
提交失敗,因?yàn)楫?dāng)前分支的版本低于遠(yuǎn)程分支的版本,所以要想覆蓋掉它,必須使用force
git push origin 分支 –force
ok,大功告成
注:以上內(nèi)容來(lái)自轉(zhuǎn)載