很多時(shí)候,git新手很容易誤操作壳嚎,而git reset --hard xxx/soft xxx、git revert 都是用來撤銷代碼倉庫中的某些更改的绎橘,它們非常相似迟赃,在用的時(shí)候很容易混淆,下面比較一下它們的區(qū)別及作用渴庆。
Git倉庫有三個(gè)主要的組成铃芦,工作目錄、暫存區(qū)襟雷、提交歷史刃滓。
resert
如果修改了某些內(nèi)容,但是還沒有push到遠(yuǎn)程倉庫耸弄,可以用git reset去撤銷更改咧虎,除了在當(dāng)前分支上操作,還可以通過傳入標(biāo)記來修改緩存區(qū)或者工作目錄计呈,這些標(biāo)記限定了git reset的作用域砰诵,常常跟HEAD作為參數(shù)一起使用。
例如:
git resert HEAD^2
reset操作如下圖所示:
- git reset --soft xxx:回退到某個(gè)版本捌显,只退回了commit的信息茁彭,不會(huì)回復(fù)到index file一級(jí)。如果還要提交苇瓣,直接commit即可尉间。也就是說緩存區(qū)和工作目錄都不會(huì)改變,改變的是提交歷史。
- git reset --hard xxx:徹底退回到某個(gè)版本哲嘲,本都的源碼也會(huì)變?yōu)樯细鱾€(gè)版本的內(nèi)容贪薪,也就是緩存區(qū)和工作目錄都同步到你指定的提交。
如果你想完全舍棄你沒有提交的改動(dòng)眠副,可以使用git reset --hard HEAD画切。
revert
如果我們修改了某些內(nèi)容,已經(jīng)commit到本地倉庫囱怕,并且push到遠(yuǎn)程倉庫了霍弹,這種情況下想把本地和遠(yuǎn)程倉庫都回退到某個(gè)版本,該怎么做呢娃弓?
前面講到的用git reset只是在本地倉庫中回退版本典格,而遠(yuǎn)程倉庫的版本不會(huì)變化,這樣台丛,及時(shí)本地reset了耍缴,但如果再git pull,那么挽霉,遠(yuǎn)程倉庫的內(nèi)容又會(huì)和本地之前版本的內(nèi)容進(jìn)行merge防嗡,這并不是我們想要的東西。
對(duì)于已經(jīng)把代碼push到遠(yuǎn)程倉庫侠坎,你退回本地代碼其實(shí)也想同時(shí)退回線上代碼蚁趁,回滾到某個(gè)指定的版本,線上線下代碼保持一致实胸。git revert用于撤銷某次操作他嫡,此次操作之前和之后的commit和history都會(huì)保留,即用一個(gè)新提交來消除一個(gè)歷史提交所做的任何修改童芹。
git revert HEAD 撤銷前一次commit
git revert HEAD^ 撤銷前前一次commit
git revert commit xxx 撤銷指定的版本涮瞻,撤銷也會(huì)作為一次提交進(jìn)行保存鲤拿。
revert之后你的本地代碼會(huì)回滾到指定的歷史版本假褪,然后再git push。
- git revert是用一次新的commit來回滾之前的commit近顷,git reset是直接刪除指定的commit生音。
- git reset是把HEAD向后移動(dòng)了一下,而git revert是HEAD繼續(xù)前進(jìn)窒升,只是新的commit的內(nèi)容跟要revert的內(nèi)容正好相反缀遍,能夠抵消要被revert的內(nèi)容。