1.寫在前面
我們?cè)谑褂肎it進(jìn)行版本控制時(shí),有可能會(huì)出現(xiàn)這種情況褪子。git push后發(fā)現(xiàn)提交的內(nèi)容不是想要的,這時(shí)候我們?cè)趺醋瞿兀峤簧先サ膬?nèi)容是沒有刪除按鈕的(比如github烟逊,或碼云)。所以我們需要一些手段將提交上去內(nèi)容撤銷下來铺根。
2.解決
首先將本地的內(nèi)容回退到自己想要的版本宪躯。回退版本我一般使用
git reset
其中這條命令中又分為兩種
git reset –hard
git reset –soft
注意上者的區(qū)別位迂,在說這兩者區(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í)的代碼苇侵,所以使用是一定要小心赶盔,想清楚。
然后再來看回退衅檀,如果只是回退到上個(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了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)沒,代碼還在緩存區(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á)到了撤銷遠(yuǎn)程倉(cāng)庫(kù)代碼一樣的效果西设,但是這里有點(diǎn)點(diǎn)問題,先接著看吧
提交失敗答朋,因?yàn)楫?dāng)前分支的版本低于遠(yuǎn)程分支的版本贷揽,所以要想覆蓋掉它,必須使用force
git push origin 分支 –force
ok梦碗,大功告成
注:以上內(nèi)容來自轉(zhuǎn)載