首先了解幾個(gè)術(shù)語
HEAD
這是當(dāng)前分支版本頂端的別名,也就是在當(dāng)前分支你最近的一個(gè)提交,也就是本地倉庫,即你的commit記錄
index
index也被稱為staging area,即add的記錄
Working Copy
working copy代表你正在工作的那個(gè)文件
git reset --soft xxx
首先我們在本地創(chuàng)建一個(gè)Project的倉庫,依次添加三個(gè)文件1.md、2.md、3.md,然后用git log查看本地倉庫的狀態(tài),也就是commit(HEAD)的記錄

可以看到我們進(jìn)行了3次commit,然后我們進(jìn)行g(shù)it reset --soft操作

可以看到最近的一次commit被撤銷,但它仍在緩存區(qū)里,也就是并沒有撤銷add,如果你想繼續(xù)提交只需commit即可
git reset --mixed xxx

可以發(fā)現(xiàn),除了最近的一次commit被撤銷之外,相應(yīng)的add也被撤銷,但工作區(qū)的內(nèi)容并沒有改變,如果你想再次提交則需要先add,再進(jìn)行commit
git reset --hard xxx

可以發(fā)現(xiàn),除了最近的一次commit被撤銷之外,相應(yīng)的add也被撤銷外,工作區(qū)的內(nèi)容也被撤銷,也就是HEAD、index、Working Copy都回復(fù)到之前一次的操作,三者保持一致狀態(tài)。
git revert xxx


git revert 撤銷某次操作,此次操作之前和之后的commit和history都會保留,并且把這次撤銷
作為一次最新的提交
* git revert HEAD 撤銷前一次 commit
* git revert HEAD^ 撤銷前前一次 commit
* git revert commit (比如:rfa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤銷指定的版本,撤銷也會作為一次提交進(jìn)行保存。
git revert是提交一個(gè)新的版本,將需要revert的版本的內(nèi)容再反向修改回去,
版本會遞增,不影響之前提交的內(nèi)容
總結(jié)
git revert 和 git reset的區(qū)別
- git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
- 在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時(shí)有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時(shí),導(dǎo)致這部分改變不會再次出現(xiàn),但是git reset是之間把某些commit在某個(gè)branch上刪除,因而和老的branch再次merge時(shí),這些被回滾的commit應(yīng)該還會被引入。
- git reset 是把HEAD向后移動了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。